Async Database#

An asyncio-compatible database interface is the sqlservice.async_database.AsyncDatabase class which has the same interface as the sqlservice.database.Database class.

Before we get to the good stuff, let’s first start by creating our asynchronous database object:

from sqlservice import AsyncDatabase

# Let's assume you've define the User, UserAbout, UserDevice, and UserDeviceKey
# as illustrated in the "Model" section of the docs in a module called models.py
# with a declarative base named Model.
from models import Model

db = Database("sqlite+aiosqlite://", model_class=Model)

Note

For details on the available configuration values, see sqlservice.async_database.AsyncDatabase.

The AsyncDatabase class can be used as a provider of database connections and sessions using the 2.0 style of SQLAlchemy:

conn = await db.connect()
session = await db.session()

# Or as context-managers...
async with db.connect() as conn:
    # high-level DB-API connection

async with db.session() as session:
    # ORM session, commit as you go

async with db.begin() as session:
    # ORM session, automatic commit when context-manager exits

See also

Learn more about the new 2.0 style from the SQLAlchemy 1.4 / 2.0 Tutorial.

Engine#

Nothing fancy here. The sqlservice.async_database.AsyncDatabase.engine` is created using sqlalchemy.create_async_engine under the hood using the database settings provided. Typically, the engine won’t be used directly. Instead, database connections and sessions can be created using these methods:

Session#

The sqlservice.async_database.AsyncDatabase.session() and sqlservice.async_database.AsyncDatabase.begin() methods are factories that provide ORM sessions. The main difference is that begin() is a context-manager that will start a transaction when entering the context-manager, commit the transaction on exit, and automatically rollback if an unhandled exception occurs.

The default class used to create sessions is sqlservice.async_session.AsyncSession which extends sqlalchemy.ext.asyncio.AsyncSession. You can override the session class using AsyncDatabase(session_class=MySession).

For more details, see the sqlservice.async_session module.

ORM Models#

The declarative base model passed into AsyncDatabase (or autogenerated when excluded) has its metadata available at sqlservice.async_database.AsyncDatabase.metadata. There are several metadata based methods available.

Create Model Tables#

Create all ORM model tables with:

await db.create_all()

This will issue the appropriate SQL DDL statements that can get your database up and running quickly. For full migration integration, see alembic.

Drop Model Tables#

Drop all ORM model tables with:

await db.drop_all()

Reflect Models#

Reflect existing database schema without predefining ORM models or Table objects:

await db.reflect()
print(db.tables)

For more details, see the sqlservice.async_database module.