Skip to main content

lexigram-sql

SQL database abstractions for Lexigram Framework — Postgres, MySQL, SQLite with migrations, repositories, and query building.


Overview

lexigram-sql provides an async SQLAlchemy ORM layer with the repository pattern, unit-of-work, connection pooling, multi-database support, Alembic migrations, and optional HMAC audit checksums. All database operations are wired through DatabaseProviderProtocol in the DI container.


Full documentation: docs.lexigram.dev

Install

uv add lexigram lexigram-sql

# With async PostgreSQL driver
uv add "lexigram-sql[postgres]"

# With async MySQL driver
uv add "lexigram-sql[mysql]"

# With SQLite async driver
uv add "lexigram-sql[sqlite]"

Quick Start

from lexigram import Application, StandardModule
from lexigram.di.module import Module, module
from lexigram.sql import DatabaseModule
from lexigram.sql.config import DatabaseConfig


@module(
    imports=[
        DatabaseModule.configure(
            DatabaseConfig(url="postgresql+asyncpg://user:pass@localhost/mydb")
        )
    ]
)
class AppModule(Module):
    pass


async def main() -> None:
    async with Application.boot(modules=[AppModule]) as app:
        from lexigram.contracts.data.sql.database import DatabaseProviderProtocol

        db = await app.container.resolve(DatabaseProviderProtocol)
        result = await db.execute_query("SELECT 1")


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

Configuration

Zero-config usage: Call DatabaseModule.configure() with no arguments to use all defaults (SQLite).

Option 1 — YAML file

# application.yaml
sql:
  backend:
    url: "${LEX_SQL__BACKEND__URL}"
  pool:
    min_size: 2
    max_size: 10
    timeout: 30
  operations:
    echo: false

Option 2 — Profiles + Environment Variables (recommended)

export LEX_SQL__BACKEND__URL=postgresql+asyncpg://user:pass@host/db
export LEX_SQL__POOL__MAX_SIZE=20
export LEX_SQL__POOL__TIMEOUT=60

Option 3 — Python

from lexigram.sql import DatabaseModule
from lexigram.sql.config import DatabaseConfig

DatabaseModule.configure(
    DatabaseConfig(
        url="postgresql+asyncpg://user:pass@localhost/mydb",
    )
)

Config reference

Field Default Env var Description
backend.url "sqlite:///data.db" LEX_SQL__BACKEND__URL Database connection URL
pool.min_size 1 LEX_SQL__POOL__MIN_SIZE Minimum pool connections
pool.max_size 10 LEX_SQL__POOL__MAX_SIZE Maximum pool connections
pool.timeout 30 LEX_SQL__POOL__TIMEOUT Pool acquire timeout (seconds)
operations.echo False LEX_SQL__OPERATIONS__ECHO Echo SQL statements
audit_hmac_key None LEX_SQL__AUDIT_HMAC_KEY HMAC key for audit checksums

Module Factory Methods

Method Description
DatabaseModule.configure(config, enable_migrations, migration_dir) Configure with explicit DatabaseConfig
DatabaseModule.scope(*repositories) Scope repository classes into a feature module
DatabaseModule.stub(config=None) In-memory SQLite for testing

Key Features

  • Repository patternSQLRepository base class with find, create, update, delete, count
  • Unit of workAbstractUnitOfWork tracks changes and publishes domain events on commit
  • Multi-databaseNamedDatabaseConfig for multiple backends resolved via Annotated[DatabaseProviderProtocol, Named("analytics")]
  • Connection pooling — SQLAlchemy async pool with configurable min/max size
  • Alembic migrations — optional, run on boot only when enable_migrations=True (off by default)
  • HMAC audit checksums — optional signing of write operations for integrity verification
  • Production security — blocks default passwords (:password@, :postgres@, etc.) when LEX_ENV=production

Testing

from lexigram import Application
from lexigram.sql import DatabaseModule
from lexigram.sql.config import DatabaseConfig


async def test_repository():
    async with Application.boot(
        modules=[
            DatabaseModule.stub(DatabaseConfig(url="sqlite+aiosqlite:///:memory:"))
        ]
    ) as app:
        db = await app.container.resolve(DatabaseProviderProtocol)
        # run your test queries

Key Source Files

File What it contains
src/lexigram/sql/module.py DatabaseModule.configure(), .scope(), .stub()
src/lexigram/sql/config.py DatabaseConfig, DatabasePoolConfig, NamedDatabaseConfig
src/lexigram/sql/di/provider.py DatabaseProvider boot and registration
src/lexigram/sql/repositories/base.py SQLRepository base class
src/lexigram/sql/unit_of_work/base.py AbstractUnitOfWork

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lexigram_sql-0.1.5001.tar.gz (460.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lexigram_sql-0.1.5001-py3-none-any.whl (308.0 kB view details)

Uploaded Python 3

File details

Details for the file lexigram_sql-0.1.5001.tar.gz.

File metadata

  • Download URL: lexigram_sql-0.1.5001.tar.gz
  • Upload date:
  • Size: 460.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.14

File hashes

Hashes for lexigram_sql-0.1.5001.tar.gz
Algorithm Hash digest
SHA256 70aee5ba1053307436c7d78fe269e101bc0c6b5d9392ce90950da610182c5951
MD5 ad835149ffb52c3da1bacfdf44091946
BLAKE2b-256 1cc4eee1489ce00d3a03bb825183cf9ac09c2f3a462900fa3bbbcb3b2de0c824

See more details on using hashes here.

File details

Details for the file lexigram_sql-0.1.5001-py3-none-any.whl.

File metadata

File hashes

Hashes for lexigram_sql-0.1.5001-py3-none-any.whl
Algorithm Hash digest
SHA256 7668c5fb6fb9041d686e45a5f281b98aa086edaa4458639ace6b23bfe169ff06
MD5 4060185a217f8028f517de112105e4a4
BLAKE2b-256 b4f2132cf72dc77e979198426b5d9e7e6d6b65a08858a295f50905d88d0673da

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5010

1 file

0.1.5007

2 files

0.1.5004

2 files

This release

0.1.5001 This release

2 files

0.1.3007

1 file

0.1.3006

1 file

0.1.3005

1 file

0.1.4

2 files

0.1.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page