aiohttp-sqlalchemy’s documentation
SQLAlchemy 1.4 / 2.0 support for AIOHTTP.
The library provides the next features:
initializing asynchronous sessions through a middlewares;
initializing asynchronous sessions through a decorators;
simple access to one asynchronous session by default key;
preventing attributes from being expired after commit by default;
support different types of request handlers;
support nested applications.
Installation
Installing aiohttp-sqlalchemy
with pip:
pip install aiohttp-sqlalchemy
Optional requirements
For PostgreSQL support, you also need install asyncpg
:
pip install asyncpg
For MySQL support, you also need install aiomysql
:
pip install aiomysql
For SQLite3 support, you also need install aiosqlite
:
pip install aiosqlite
Quickstart
Simple example
Install aiosqlite
for work with sqlite3:
pip install aiosqlite
Copy and paste this code in a file and run:
from datetime import datetime
import sqlalchemy as sa
from aiohttp import web
from sqlalchemy import orm
import aiohttp_sqlalchemy as ahsa
metadata = sa.MetaData()
Base = orm.declarative_base(metadata=metadata)
class MyModel(Base):
__tablename__ = 'my_table'
pk = sa.Column(sa.Integer, primary_key=True)
timestamp = sa.Column(sa.DateTime(), default=datetime.now)
async def main(request):
sa_session = ahsa.get_session(request)
async with sa_session.begin():
sa_session.add(MyModel())
result = await sa_session.execute(sa.select(MyModel))
result = result.scalars()
data = {
instance.pk: instance.timestamp.isoformat()
for instance in result
}
return web.json_response(data)
async def app_factory():
app = web.Application()
ahsa.setup(app, [
ahsa.bind('sqlite+aiosqlite:///'),
])
await ahsa.init_db(app, metadata)
app.add_routes([web.get('/', main)])
return app
if __name__ == '__main__':
web.run_app(app_factory())
SQLAlchemy and Asyncio
See Asynchronous I/O (asyncio) section in SQLAlchemy 1.4 documentation.
More control in configuration
import aiohttp_sqlalchemy as ahsa
from sqlalchemy import orm
url = 'sqlite+aiosqlite:///'
engine = create_async_engine(url, echo=True)
Session = orm.sessionmaker(main_engine, AsyncSession, expire_on_commit=False)
ahsa.setup(app, [
ahsa.bind(Session),
])
Class based views
from aiohttp import web
import aiohttp_sqlalchemy as ahsa
class MyClassBasedView(web.View, ahsa.SAMixin):
async def get(self):
db_session = self.get_sa_session()
async with db_session.begin():
# some your code
ahsa.setup(app, [
ahsa.bind(MainSession),
])
app.add_routes([web.view('/', MyClassBasedView)])
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)])
Reference
Main user functionality
- aiohttp_sqlalchemy.setup(app, binds)
Setup function for SQLAlchemy binding to AIOHTTP application.
- Parameters
app (aiohttp.web_app.Application) – your AIOHTTP application.
binds (Iterable[Tuple[sqlalchemy.orm.session.sessionmaker, str, bool]]) – iterable of aiohttp_sqlalchemy.bind() calls.
- Return type
None
- aiohttp_sqlalchemy.bind(target, key='sa_main', *, middleware=True)
Function wrapper for binding.
- Parameters
target (Union[str, sqlalchemy.ext.asyncio.engine.AsyncEngine, sqlalchemy.orm.session.sessionmaker]) – argument can be database connection url, asynchronous engine or asynchronous session factory.
key (str) – key of SQLAlchemy binding.
middleware (bool) – bool for enable middleware. True by default.
- Return type
Tuple[sqlalchemy.orm.session.sessionmaker, str, bool]
- async aiohttp_sqlalchemy.init_db(app, metadata, key='sa_main')
Create all tables, indexes and etc.
- Parameters
app (aiohttp.web_app.Application) – your AIOHTTP application.
metadata (sqlalchemy.sql.schema.MetaData) –
…
key (str) – key of SQLAlchemy binding.
- Return type
None
- aiohttp_sqlalchemy.get_session(request, key='sa_main')
Return AsyncSession instance.
- Parameters
request (aiohttp.web_request.Request) – AIOHTTP request object.
key (str) – key of SQLAlchemy binding.
- Return type
sqlalchemy.ext.asyncio.session.AsyncSession
Class based views
Warning
The API of class based views is experimental and unstable.
- class aiohttp_sqlalchemy.SAMixin(request)
Bases:
aiohttp_things.web_handlers.ContextMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
- class aiohttp_sqlalchemy.SAModelMixin(request)
Bases:
aiohttp_sqlalchemy.web_handlers.SAMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
Instance mixins
- class aiohttp_sqlalchemy.PrimaryKeyMixin(request)
Bases:
aiohttp_things.web_handlers.PrimaryKeyMixin
,aiohttp_sqlalchemy.web_handlers.SAModelMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- class UnitAddMixin(request)
Bases:
aiohttp_sqlalchemy.web_handlers.SAModelMixin
,aiohttp_things.web_handlers.ItemMixin
- property UnitAddMixin.request: None
Request instance.
- property request: None
Request instance.
- class aiohttp_sqlalchemy.UnitDeleteMixin(request)
Bases:
aiohttp_sqlalchemy.web_handlers.DeleteStatementMixin
,aiohttp_sqlalchemy.web_handlers.PrimaryKeyMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
- class aiohttp_sqlalchemy.UnitEditMixin(request)
Bases:
aiohttp_things.web_handlers.ItemMixin
,aiohttp_sqlalchemy.web_handlers.UpdateStatementMixin
,aiohttp_sqlalchemy.web_handlers.PrimaryKeyMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
- class aiohttp_sqlalchemy.UnitViewMixin(request)
Bases:
aiohttp_things.web_handlers.ItemMixin
,aiohttp_sqlalchemy.web_handlers.SelectStatementMixin
,aiohttp_sqlalchemy.web_handlers.PrimaryKeyMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
List mixins
- class aiohttp_sqlalchemy.OffsetPaginationMixin(request)
Bases:
aiohttp_things.web_handlers.PaginationMixin
,aiohttp_sqlalchemy.web_handlers.SelectStatementMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- page_key_adapter
alias of
int
- property request: None
Request instance.
- class aiohttp_sqlalchemy.ListAddMixin(request)
Bases:
aiohttp_things.web_handlers.ListMixin
,aiohttp_sqlalchemy.web_handlers.SAModelMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
- class aiohttp_sqlalchemy.ListDeleteMixin(request)
Bases:
aiohttp_things.web_handlers.ListMixin
,aiohttp_sqlalchemy.web_handlers.DeleteStatementMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- property request: None
Request instance.
Views
- class aiohttp_sqlalchemy.SABaseView(request)
Bases:
aiohttp.web_urldispatcher.View
,aiohttp_sqlalchemy.web_handlers.SAMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
- class aiohttp_sqlalchemy.SAModelView(request)
Bases:
aiohttp.web_urldispatcher.View
,aiohttp_sqlalchemy.web_handlers.SAModelMixin
- Parameters
request (aiohttp.web_request.Request) –
- Return type
None
Additional functionality
- aiohttp_sqlalchemy.sa_decorator(key='sa_main')
SQLAlchemy asynchronous handler decorator.
- Parameters
key (str) – key of SQLAlchemy binding.
- Return type
Callable[[…], Callable[[…], Awaitable[aiohttp.web_response.StreamResponse]]]
- aiohttp_sqlalchemy.sa_middleware(key='sa_main')
SQLAlchemy asynchronous middleware factory.
- Parameters
key (str) – key of SQLAlchemy binding. Has default.
- Return type
Callable[[…], Awaitable[aiohttp.web_response.StreamResponse]]
- async aiohttp_sqlalchemy.get_engine(app, key='sa_main')
Return AsyncEngine instance.
- Parameters
app (aiohttp.web_app.Application) – your AIOHTTP application.
key (str) – key of SQLAlchemy binding.
- Return type
sqlalchemy.ext.asyncio.engine.AsyncEngine
- aiohttp_sqlalchemy.get_session_factory(source, key='sa_main')
Return callable object which returns an AsyncSession instance.
- Parameters
source (Union[aiohttp.web_request.Request, aiohttp.web_app.Application]) – AIOHTTP request object or your AIOHTTP application.
key (str) – key of SQLAlchemy binding.
- Return type
sqlalchemy.orm.session.sessionmaker
Releases
Version 0.34
Added
Add official support Python 3.10;
Add
get_engine
util.
Changed
Argument
target
in signaturebind(target ,key=SA_DEFAULT_KEY, *, middleware=True)
can be of the following typesstr
,sqlalchemy.ext.asyncio.AsyncEngine
,sqlalchemy.orm.sessionmaker
or their compatible descendants. Custom session factory is no longer supported.
Removed
Removed
views
synonym forweb_handlers
;Removed
ItemAddMixin
synonym forUnitAddMixin
;Removed
ItemDeleteMixin
synonym forUnitDeleteMixin
;Removed
ItemEditMixin
synonym forUnitEditMixin
;Removed
ItemViewMixin
synonym forUnitViewMixin
;Removed
OffsetPagination
synonym forOffsetPaginationMixin
;Removed
SAItemAddMixin
synonym forUnitAddMixin
;Removed
SAItemDeleteMixin
synonym forUnitDeleteMixin
;Removed
SAItemEditMixin
synonym forUnitEditMixin
;Removed
SAItemViewMixin
synonym forUnitViewMixin
;Removed
SAListAddMixin'
synonym forListAddMixin
;Removed
SAListDeleteMixin
synonym forListDeleteMixin
;Removed
SAListEditMixin
synonym forListEditMixin
;Removed
SAListViewMixin
synonym forListViewMixin
;Removed
SAModelDeleteMixin
synonym forDeleteStatementMixin
;Removed
SAModelEditMixin
synonym forUpdateStatementMixin
;Removed
SAModelViewMixin
synonym forSelectStatementMixin
;Removed
SAPrimaryKeyMixin
synonym forPrimaryKeyMixin
.
Version 0.33
ItemAddMixin
is deprecated. UseUnitAddMixin
;ItemDeleteMixin
is deprecated. UseUnitDeleteMixin
;ItemEditMixin
is deprecated. UseUnitEditMixin
;ItemViewMixin
is deprecated. UseUnitViewMixin
.
Version 0.32
Added
prepare_context()
method forOffsetPaginationMixin
.
Version 0.31
Added
Added default
page_key
andpage_key_adapter
attributes forOffsetPaginationMixin
;Added
execute_select_stmt()
method forOffsetPaginationMixin
.
Deprecated
OffsetPagination
is deprecated. UseOffsetPaginationMixin
;SAModelDeleteMixin
is deprecated. UseDeleteStatementMixin
;SAModelEditMixin
is deprecated. UseUpdateStatementMixin
;SAModelViewMixin
is deprecated. UseSelectStatementMixin
.
Version 0.30
Deprecated
views
module is deprecated. Use import fromaiohttp_sqlalchemy
oraiohttp_sqlalchemy.web_handlers
;SAItemAddMixin
synonym is deprecated. UseItemAddMixin
class;SAItemDeleteMixin
is deprecated. UseItemDeleteMixin
class;SAItemEditMixin
synonym is deprecated. UseItemEditMixin
class;SAItemViewMixin
synonym is deprecated. UseItemViewMixin
class;SAListAddMixin
synonym is deprecated. UseListAddMixin
class;SAListDeleteMixin
synonym is deprecated. UseListDeleteMixin
class;SAListEditMixin
synonym is deprecated. UseListEditMixin
class;SAListViewMixin
synonym is deprecated. UseListViewMixin
class;SAPrimaryKeyMixin
synonym is deprecated. UsePrimaryKeyMixin
class.
Version 0.29
Added
OffsetPagination
.
Changed
SAListViewMixin
class is no longer inherited fromaiohttp_things.PaginationMixin
.
Version 0.28
Changed
Renamed
handlers
module toweb_handlers
;Renamed
sa_session
method toget_sa_session
inSAMixin
;Renamed
get_sa_delete_stmt
method toget_delete_stmt
inSAModelDeleteMixin
andItemDeleteMixin
;Renamed
get_sa_update_stmt
method toget_update_stmt
inSAModelEditMixin
andItemEditMixin
;Renamed
get_sa_view_stmt
method toget_select_stmt
inSAModelViewMixin
andItemViewMixin
.
Version 0.27
Added
SAItemAddMixin
as a synonym forItemAddMixin
;SAItemDeleteMixin
as a synonym forItemDeleteMixin
;SAItemEditMixin
as a synonym forItemEditMixin
;SAItemViewMixin
as a synonym forItemViewMixin
;SAListAddMixin
as a synonym forListAddMixin
;SAListDeleteMixin
as a synonym forListDeleteMixin
;SAListEditMixin
as a synonym forListEditMixin
;SAListViewMixin
as a synonym forListViewMixin
;SAPrimaryKeyMixin
as a synonym forPrimaryKeyMixin
.
Changed
views
module renamed tohandlers
;classes from
handlers
temporarily imported to emptyviews
module for backward compatibility;SAItemAddMixin
renamed toItemAddMixin
;SAItemDeleteMixin
renamed toItemDeleteMixin
;SAItemEditMixin
renamed toItemEditMixin
;SAItemViewMixin
renamed toItemViewMixin
;SAListAddMixin
renamed toListAddMixin
;SAListDeleteMixin
renamed toListDeleteMixin
;SAListEditMixin
renamed toListEditMixin
;SAListViewMixin
renamed toListViewMixin
;SAPrimaryKeyMixin
renamed toPrimaryKeyMixin
.
Removed
SAView
a synonym forSAModelView
.
Version 0.26
Changed
SAListViewMixin
inherited byaiohttp_things.PaginationMixin
.
Removed
SAListMixin
class removed, useaiohttp_things.ListMixin
;SAItemMixin
class removed, useaiohttp_things.ItemMixin
.
Version 0.25
Changed
Attribute
instance
renamed toitem
inSAItemAddMixin
,SAItemEditMixin
,SAItemViewMixin
.
Removed
SAInstanceMixin
removed, useSAItemMixin
.
Version 0.24
Removed
SAInstanceView
class;SAItemView
synonym forSAInstanceView
;SAAbstractView
synonym forSAMixin
;SAOneModelMixin
synonym forSAModelMixin
;SAInstanceAddMixin
synonym forSAItemAddMixin
;SAInstanceDeleteMixin
synonym forSAItemDeleteMixin
;SAInstanceEditMixin
synonym forSAItemEditMixin
;SAInstanceViewMixin
synonym forSAItemViewMixin
.
Version 0.23
Add
SAItemMixin
as a separate mixin;SAInstanceAddMixin
as a synonym forSAItemAddMixin
;SAInstanceDeleteMixin
as a synonym forSAItemDeleteMixin
;SAInstanceEditMixin
as a synonym forSAItemEditMixin
;SAInstanceViewMixin
as a synonym forSAItemViewMixin
;
Changed
SAInstanceAddMixin
renamed toSAItemAddMixin
;SAInstanceDeleteMixin
renamed toSAItemDeleteMixin
;SAInstanceEditMixin
renamed toSAItemEditMixin
;SAInstanceViewMixin
renamed toSAItemViewMixin
;SAItemMixin
is no longer a synonym forSAInstanceMixin
.
Version 0.22
Added
SAModelDeleteMixin
;SAModelEditMixin
;SAModelViewMixin
;SAPrimaryKeyMixin
;SAInstanceAddMixin
;SAInstanceDeleteMixin
;SAInstanceEditMixin
;SAInstanceViewMixin
;SAListMixin
;SAListAddMixin
;SAListDeleteMixin
;SAListEditMixin
;SAListViewMixin
.
Version 0.21
Changed
Rename
SAItemMixin
toSAInstanceMixin
;Rename
SAItemView
toSAInstanceView
.
Added
SAItemMixin
as a synonym forSAInstanceMixin
;SAItemView
as a synonym forSAInstanceView
.
Version 0.20
Added
Added
SAItemMixin
;Added
SAItemView
.
Version 0.19
Added
sa_session
as a synonym forget_session
;sa_session_factory
as a synonym forget_session_factory
.
Changed
Rename
sa_session
toget_session
;Rename
sa_session_factory
toget_session_factory
.
Version 0.18.1
Added
SAView
as a synonym forSAModelView
.
Changed
Rename
SAView
toSAModelView
.
Version 0.18
Changed
First argument of function
aiohttp_sqlalchemy.bind()
renamed frombind_to
totarget
;Type hint alias
TBinding
renamed toTBind
;Type hint alias
TBindings
renamed toTBinds
;Type hint alias
TBindTo
renamed toTTarget
.
Version 0.17
Added
views.SAAbstractView
as a synonym forviews.SAMixin
;views.SAOneModelMixin
as a synonym forviews.SAModelMixin
;
Changed
type checks in
aiohttp_sqlalchemy.bind()``including replacing from ``ValueError
toTypeError
;views.SAAbstractView
renamedviews.SAMixin
;views.SAOneModelMixin
renamedviews.SAModelMixin
.
Removed
Removed type check of result of call session factory.
Version 0.16
Added
Added utility
sa_session_factory(source, key = SA_DEFAULT_KEY)
, whensource
can be instance ofaiohttp.web.Request
oraiohttp.web.Application
.
Version 0.15.4
Changed
Changed
DEFAULT_KEY
from deprecated to synonym.
Version 0.15
Added
Added synonym
bind
forsa_bind
;Added synonym
init_db
forsa_init_db
.
Version 0.14
Added
Added utility
sa_init_db(app, metadata, key = SA_DEFAULT_KEY)
;Added constant
SA_DEFAULT_KEY
insteadDEFAULT_KEY
.
Deprecated
DEFAULT_KEY
is deprecated. UseSA_DEFAULT_KEY
.
Version 0.13
Changed
Argument
expire_on_commit
ofsessionmaker
set toFalse
by default.
Version 0.12
Added
Added
sa_session_key
attribute inSAAbstractView
class;Added support url and
AssyncEngine
instance as first argument insa_bind()
.
Changed
Rename first argument from
factory
tobind_to
insa_bind()
signature.
Version 0.11
Added
Added
sa_session(request, key='sa_main')
utility.
Version 0.10
Added
Added support Python 3.7.
Version 0.9
Added
Support of organized handlers in class added to
sa_decorator(key)
.
Removed
Removed support of
AsyncEngine
type insa_bind()
signature. Usesessionmaker(engine, AsyncSession)
or custom session factory returningAsyncSession
instance.
Version 0.8
Changed
Rename first argument from
arg
tofactory
insa_bind()
signature.
Deprecated
AsyncEngine
type is deprecated insa_bind()
signature. Usesessionmaker(engine, AsyncSession)
or custom session factory returningAsyncSession
instance.
Version 0.7
Changed
Usage
sqlalchemy.orm.sessionmaker
instance is recomended as a first argument foraiohttp_sqlalchemy.sa_bind()
signature. See examples in documetation.
Removed
Removed support of
request.config_dict.get('sa_main')
andrequest.app['sa_main']
expressions. Use arequest['sa_main'].bind
expression.
Version 0.6
Added
Add support
sqlalchemy.orm.sessionmaker
as a first argument in functionsa_bind(arg, key, middleware)
.
Changed
Argument
engine: AsyncEngine
changed toarg: Union[AsyncEngine, sessionmaker]
insa_bind()
signature.
Deprecated
Deprecated support of
request.config_dict.get('sa_main')
andrequest.app['sa_main']
expressions. Use arequest['sa_main'].bind
expression.
Removed
Deprecated class
views.SAViewMixin
is removed. Useviews.SAAbstractView
;Deprecated attribute
SAView.sa_main_session
is removed. Use methodSAView.sa_session(key: str = 'sa_main')
.
Version 0.5
Removed
Deprecated function
aiohttp_sqlalchemy.sa_engine()
is removed. Useaiohttp_sqlalchemy.sa_bind()
.
Deprecated
Undocumented class
views.SAViewMixin
is deprecated. Useviews.SAAbstractView
.
Version 0.4
Added
SAView.sa_session(key: str = 'sa_main')
function is added insteadSAView.sa_main_session
.
Deprecated
SAView.sa_main_session
is deprecated. UseSAView.sa_session(key: str = 'sa_main')
.
Version 0.3
Added
aiohttp_sqlalchemy.sa_bind()
function is added insteadaiohttp_sqlalchemy.sa_engine()
.
Deprecated
aiohttp_sqlalchemy.sa_engine()
function is deprecated. Useaiohttp_sqlalchemy.sa_bind()
.