# azure-functions-db-python

> Database trigger and input/output bindings for Azure Functions Python v2, powered by SQLAlchemy.

## Package Info

- PyPI: `pip install azure-functions-db-python`
- Version: 0.1.0
- Python: >=3.10, <3.15
- License: MIT
- Docs: https://yeongseon.github.io/azure-functions-db-python/
- Repository: https://github.com/yeongseon/azure-functions-db-python

## What It Does

Database integration for Azure Functions Python v2. Provides poll-based change
detection trigger, declarative input/output bindings, and imperative client
injection — all via SQLAlchemy with multi-DB support (PostgreSQL, MySQL, SQL Server).

## Core API

- `DbBindings` — Decorator namespace for all db operations
- `DbBindings.input(arg_name, url, table, pk, query, ...)` — Inject query results into handler
- `DbBindings.output(arg_name, url, table, ...)` — Inject DbOut for explicit writes via .set()
- `DbBindings.inject_reader(arg_name, url, ...)` — Inject DbReader for imperative reads
- `DbBindings.inject_writer(arg_name, url, ...)` — Inject DbWriter for imperative writes
- `DbBindings.trigger(arg_name, source, checkpoint_store, ...)` — Poll-based change detection
- `DbOut` — Output binding parameter; call .set(data) to write
- `DbReader` — Imperative reader with .get(pk) and .query(sql)
- `DbWriter` — Imperative writer with .insert(), .upsert(), .update(), .delete()
- `SqlAlchemySource` — Database source adapter for triggers
- `BlobCheckpointStore` — Azure Blob Storage checkpoint persistence
- `PollTrigger` — Low-level poll trigger engine
- `EngineProvider` — Shared SQLAlchemy engine management

## Quick Start

```python
from azure_functions_db import DbBindings, DbOut

db = DbBindings()

# Input binding — inject query results
@db.input("users", url="%DB_URL%",
          query="SELECT * FROM users WHERE active = :active",
          params={"active": True})
def list_users(users: list[dict]) -> None:
    for user in users:
        print(user["email"])

# Output binding — explicit write via .set()
@db.output("out", url="%DB_URL%", table="orders")
def create_order(out: DbOut) -> str:
    out.set({"id": 1, "status": "pending"})
    return "Created"
```

## Installation

```bash
pip install azure-functions-db-python[postgres]   # PostgreSQL
pip install azure-functions-db-python[mysql]      # MySQL
pip install azure-functions-db-python[mssql]      # SQL Server
pip install azure-functions-db-python[all]        # All drivers
```

## Documentation

- [Architecture](https://yeongseon.github.io/azure-functions-db-python/02-architecture/)
- [Semantics](https://yeongseon.github.io/azure-functions-db-python/03-semantics/)
- [Python API Spec](https://yeongseon.github.io/azure-functions-db-python/04-python-api-spec/)

## Ecosystem

Part of **Azure Functions Python DX Toolkit**:
- `azure-functions-openapi-python` — OpenAPI and Swagger UI
- `azure-functions-validation-python` — Request/response validation
- **azure-functions-db-python** — Database trigger and bindings
- `azure-functions-logging-python` — Structured logging
- `azure-functions-doctor-python` — Pre-deploy diagnostics
- `azure-functions-scaffold-python` — Project scaffolding
