Databases

Flaxon is database-agnostic. Use any database, ORM, or driver that works with Python.

Using SQLAlchemy

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String, select

DATABASE_URL = "postgresql+asyncpg://user:pass@localhost/db"

engine = create_async_engine(DATABASE_URL)
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

@app.on_startup
async def startup():
    app.state.db = AsyncSessionLocal

@app.on_shutdown
async def shutdown():
    await engine.dispose()

@app.get("/users")
async def get_users():
    async with app.state.db() as session:
        result = await session.execute(select(User))
        return [user.to_dict() for user in result.scalars()]

Using asyncpg (PostgreSQL)

import asyncpg

@app.on_startup
async def startup():
    app.state.db = await asyncpg.create_pool(
        host="localhost",
        database="mydb",
        user="user",
        password="password",
    )

@app.on_shutdown
async def shutdown():
    await app.state.db.close()

@app.get("/users/<int:user_id>")
async def get_user(user_id: int):
    row = await app.state.db.fetchrow(
        "SELECT * FROM users WHERE id = $1", user_id
    )
    return dict(row) if row else None

Using SQLite (aiosqlite)

import aiosqlite

@app.on_startup
async def startup():
    app.state.db = await aiosqlite.connect("app.db")

@app.on_shutdown
async def shutdown():
    await app.state.db.close()

@app.get("/users")
async def get_users():
    cursor = await app.state.db.execute("SELECT * FROM users")
    rows = await cursor.fetchall()
    return [dict(zip(["id", "name"], row)) for row in rows]

Using MongoDB (Motor)

from motor.motor_asyncio import AsyncIOMotorClient

@app.on_startup
async def startup():
    client = AsyncIOMotorClient("mongodb://localhost:27017")
    app.state.db = client.mydb

@app.get("/users")
async def get_users():
    users = await app.state.db.users.find().to_list(100)
    return [{"id": str(user["_id"]), "name": user["name"]} for user in users]

Using Redis

import redis.asyncio as redis

@app.on_startup
async def startup():
    app.state.redis = redis.from_url("redis://localhost:6379")

@app.on_shutdown
async def shutdown():
    await app.state.redis.close()

@app.get("/cache/<key>")
async def get_cache(key: str):
    value = await app.state.redis.get(key)
    return {"key": key, "value": value}

Database Health Checks

from flaxon.health import DatabaseHealthCheck

db_check = DatabaseHealthCheck(db)
health.register(db_check)

@app.get("/health/db")
async def db_health():
    return await db_check.check()

Transactions

@app.post("/transfer")
async def transfer(request):
    async with app.state.db.transaction() as tx:
        await tx.execute("UPDATE accounts SET balance = balance - 100 WHERE id = $1", 1)
        await tx.execute("UPDATE accounts SET balance = balance + 100 WHERE id = $1", 2)
    return {"success": True}
Tip

Flaxon includes built-in adapters for PostgreSQL, SQLite, MySQL, MongoDB, and Redis.