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