Dependency Injection

The SQLSpec plugin integrates with Litestar’s dependency injection system. By default, it provides a session under the key db. You can customize this key or register multiple databases with distinct keys.

Default Injection

When you add SQLSpecPlugin to your app, handlers can request db to receive a session scoped to the request:

@get("/users")
async def list_users(db: AsyncSession) -> list[User]:
    result = await db.execute("SELECT * FROM users")
    return result.all(schema_type=User)

Custom Keys

Use session_dependency_key and config_dependency_key to customize injection keys. This is useful when connecting to multiple databases.

dependency keys
from sqlspec import SQLSpec
from sqlspec.adapters.sqlite import SqliteConfig

sqlspec = SQLSpec()
sqlspec.add_config(
    SqliteConfig(
        connection_config={"database": ":memory:"}, extension_config={"litestar": {"session_key": "analytics"}}
    ),
    name="analytics",
)
sqlspec.add_config(
    SqliteConfig(
        connection_config={"database": ":memory:"}, extension_config={"litestar": {"session_key": "primary"}}
    ),
    name="primary",
)

Multiple Databases

Register separate plugins for each database, each with its own key:

primary_plugin = SQLSpecPlugin(
    sqlspec,
    config_name="primary",
    session_dependency_key="primary_db",
)
analytics_plugin = SQLSpecPlugin(
    sqlspec,
    config_name="analytics",
    session_dependency_key="analytics_db",
)

@get("/report")
async def report(primary_db: AsyncSession, analytics_db: AsyncSession) -> dict:
    # Use both databases in one handler
    ...