[2/3] Integrate SQLAlchemy into FastAPI

Message ID 20200608181636.GA71741@tsubame.mg0.fr
State New
Headers show
Series
  • [1/3] Add SSO account ID in table Users
Related show

Commit Message

Frédéric Mangano-Tarumi June 8, 2020, 6:16 p.m. UTC
---
 aurweb/db.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

Patch

diff --git a/aurweb/db.py b/aurweb/db.py
index 1ccd9a07..02aeba38 100644
--- a/aurweb/db.py
+++ b/aurweb/db.py
@@ -10,6 +10,8 @@  except ImportError:
 
 import aurweb.config
 
+engine = None  # See get_engine
+
 
 def get_sqlalchemy_url():
     """
@@ -38,6 +40,34 @@  def get_sqlalchemy_url():
         raise ValueError('unsupported database backend')
 
 
+def get_engine():
+    """
+    Return the global SQLAlchemy engine.
+
+    The engine is created on the first call to get_engine and then stored in the
+    `engine` global variable for the next calls.
+    """
+    from sqlalchemy import create_engine
+    global engine
+    if engine is None:
+        engine = create_engine(get_sqlalchemy_url(),
+                               # check_same_thread is for a SQLite technicality
+                               # https://fastapi.tiangolo.com/tutorial/sql-databases/#note
+                               connect_args={"check_same_thread": False})
+    return engine
+
+
+def connect():
+    """
+    Return an SQLAlchemy connection. Connections are usually pooled. See
+    <https://docs.sqlalchemy.org/en/13/core/connections.html>.
+
+    Since SQLAlchemy connections are context managers too, you should use it
+    with Python’s `with` operator, or with FastAPI’s dependency injection.
+    """
+    return get_engine().connect()
+
+
 class Connection:
     _conn = None
     _paramstyle = None