# kuatia-storage-sql
SQL-backed `Store` implementation for the kuatia ledger.
Uses `sqlx::Any` for database-agnostic queries. Enable features to select
the backend:
```toml
[dependencies]
kuatia-storage-sql = { features = ["sqlite"] } # or "postgres"
```
## Backends
| `sqlite` (default) | SQLite via sqlx | Conformance tests pass |
| `postgres` | PostgreSQL via sqlx | Portable DDL/queries; needs a running instance to test |
The backend is detected at migration time and the matching DDL is applied from
`src/migrations/{sqlite,postgres}/` (SQLite uses `BLOB`, PostgreSQL uses
`BYTEA`). Applied migrations are tracked in a `_migrations` table, so
`migrate()` is idempotent. Upserts use portable `ON CONFLICT … DO UPDATE`, and
all ids are generated in Rust (no `AUTOINCREMENT`/`SERIAL`).
## Usage
```rust
use kuatia_storage_sql::SqlStore;
let pool = sqlx::any::AnyPoolOptions::new()
.connect("sqlite::memory:").await?;
let store = SqlStore::new(pool);
store.migrate().await?;
```
## Schema
Tables: `accounts`, `postings`, `transfers`, `transfer_accounts`, `sagas`,
`events`, `books`. Migrations run via `store.migrate()`.