Now with async sqlalchemy
parent
f0b7a90b40
commit
a8eec38beb
@ -0,0 +1,4 @@
|
|||||||
|
# Asyncio Learning
|
||||||
|
|
||||||
|
This repo contains a number for examples and experiments related to python3's asyncio functionality.
|
||||||
|
|
@ -1,22 +1,56 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from sqlmodel import create_engine, SQLModel, Session
|
from sqlmodel import SQLModel
|
||||||
|
|
||||||
|
# We used the SQLAlchemy constructs -- e.g., create_async_engine and AsyncSession
|
||||||
|
# -- since SQLModel 0.0.4 does not have wrappers for them as of writing.
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
|
||||||
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
DATABASE_URL = os.environ.get("DATABASE_URL")
|
DATABASE_URL = os.environ.get("DATABASE_URL")
|
||||||
|
|
||||||
|
|
||||||
# The major differences between SQLModel's create_engine and SQLAlchemy's
|
# The major differences between SQLModel's create_engine and SQLAlchemy's
|
||||||
# version is that the SQLModel version adds type annotations (for editor support)
|
# version is that the SQLModel version adds type annotations (for editor support)
|
||||||
# and enables the SQLAlchemy "2.0" style of engines and connections.
|
# and enables the SQLAlchemy "2.0" style of engines and connections.
|
||||||
engine = create_engine(DATABASE_URL, echo=True) # Will want a "debug mode where it doesn't echo for prod
|
|
||||||
|
|
||||||
|
# We need the 2.0 style for async support.
|
||||||
|
# engine = create_engine(DATABASE_URL, echo=True)
|
||||||
|
engine = create_async_engine(DATABASE_URL, echo=True, future=True) # Will want a "debug mode where it doesn't echo for prod
|
||||||
|
|
||||||
|
|
||||||
|
async def init_db():
|
||||||
|
"""
|
||||||
|
Our new Async init_db was
|
||||||
|
|
||||||
|
def init_db():
|
||||||
|
SQLModel.metadata.create_all(engine)
|
||||||
|
|
||||||
|
metadata.create_all doesn't execute asynchronously,
|
||||||
|
so we used run_sync to execute it synchronously within
|
||||||
|
the async function.
|
||||||
|
"""
|
||||||
|
async with engine.begin() as conn:
|
||||||
|
# await conn.run_sync(SQLModel.metadata.drop_all)
|
||||||
|
await conn.run_sync(SQLModel.metadata.create_all)
|
||||||
|
|
||||||
def init_db():
|
|
||||||
SQLModel.metadata.create_all(engine)
|
|
||||||
|
|
||||||
|
async def get_session() -> AsyncSession:
|
||||||
|
"""
|
||||||
|
Our new async get_session
|
||||||
|
|
||||||
def get_session():
|
Was
|
||||||
"""A coroutine function for getting a database session."""
|
|
||||||
with Session(engine) as session:
|
def get_session():
|
||||||
|
with Session(engine) as session:
|
||||||
|
yield session
|
||||||
|
|
||||||
|
We disabled expire on commit behavior by passing in expire_on_commit=False.
|
||||||
|
I believe this is how flask-sqlalchemy also works
|
||||||
|
"""
|
||||||
|
async_session = sessionmaker(
|
||||||
|
engine, class_=AsyncSession, expire_on_commit=False
|
||||||
|
)
|
||||||
|
async with async_session() as session:
|
||||||
yield session
|
yield session
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue