Advansed usage
Multiple database backends per session
See Partitioning Strategies (e.g. multiple database backends per Session) section in SQLAlchemy 1.4 documentation.
Multiple session factories in application
import aiohttp_sqlalchemy as ahsa
postgresql_url = 'postgresql+asyncpg://user:password@host/database'
mysql_url = 'mysql+aiomysql://user:password@host/database'
sqlite_url = 'sqlite+aiosqlite:///path/to/file.sqlite3'
ahsa.setup(app, [
ahsa.bind(postgresql_url),
ahsa.bind(mysql_url, 'sa_second'),
ahsa.bind(sqlite_url, 'sa_third'),
])
Decorating handlers
Warning
For use a some session factory in decorators, you must set a middleware
argument to False
in bind()
call. Else will raise an exception
DuplicateRequestKeyError
.
If access to one or more databases is needed only in some request handlers, then you can
use a sa_decorator(key)
. For example:
import aiohttp_sqlalchemy as ahsa
@ahsa.sa_decorator('sa_specific')
async def specific_handler(request):
specific_db_session = ahsa.get_session(request, 'sa_specific')
async with specific_db_session.begin():
# some your code
ahsa.setup(app, [
ahsa.bind(specific_db_url, 'sa_specific', middleware=False),
])
You can combine the use of decorators with the use of middlewares. For example:
import aiohttp_sqlalchemy as ahsa
async def simple_handler(request):
main_db_session = ahsa.get_session(request)
async with main_db_session.begin():
# some your code
@ahsa.sa_decorator('sa_specific')
async def specific_handler(request):
main_db_session = ahsa.get_session(request)
specific_db_session = ahsa.get_session(request, 'sa_specific')
async with main_db_session.begin():
# some your code
async with specific_db_session.begin():
# some your code
ahsa.setup(app, [
ahsa.bind(main_db_url),
ahsa.bind(specific_db_url, 'sa_specific', middleware=False),
])
app.add_routes([
web.get('/simple', simple_handler),
web.get('/specific', specific_handler),
])
You can apply sa_decorator(key)
with class based views. For example:
from aiohttp import web
import aiohttp_sqlalchemy as ahsa
SPECIFIC_DB_KEY = 'sa_specific'
SPECIFIC_DB_URL = 'sqlite+aiosqlite:///'
class SpecificHandler(web.View, ahsa.SAMixin):
@property
def specific_session(self):
return self.get_sa_session(SPECIFIC_DB_KEY)
@ahsa.sa_decorator(SPECIFIC_DB_KEY)
async def get(self):
async with self.specific_session.begin():
# some your code
@ahsa.sa_decorator(SPECIFIC_DB_KEY)
async def post(self):
async with self.specific_session.begin():
# some your code
ahsa.setup(app, [
ahsa.bind(SPECIFIC_DB_URL, SPECIFIC_DB_KEY, middleware=False),
])
app.add_routes([web.view('/', SpecificHandler)])