# cratestack-sql
Dialect-agnostic SQL primitives shared by Postgres and SQLite backends.
## Overview
`cratestack-sql` provides common SQL primitives used by both `cratestack-sqlx` (Postgres) and `cratestack-rusqlite` (SQLite). It includes filter AST, order AST, value types, and model descriptors.
## Installation
This is an internal dependency; typically used through the umbrella crate:
```toml
[dependencies]
cratestack = "0.2"
```
For direct use:
```toml
[dependencies]
cratestack-sql = "0.2"
```
## SQL Value Types
```rust
use cratestack_sql::SqlValue;
// Supported storage types
SqlValue::String(String)
SqlValue::Int(i64)
SqlValue::Float(f64)
SqlValue::Bool(bool)
SqlValue::Bytes(Vec<u8>)
SqlValue::Uuid(uuid::Uuid)
SqlValue::DateTime(chrono::DateTime<chrono::Utc>)
SqlValue::Json(serde_json::Value)
SqlValue::Decimal(Decimal)
```
## Filter AST
```rust
use cratestack_sql::{Filter, Expr};
// Field comparisons
let filter = Filter::eq("status", "active");
let filter = Filter::and(vec![
Filter::eq("published", true),
Filter::gt("createdAt", yesterday),
]);
// Relation filters
let filter = Filter::relation("author", Filter::eq("email", "test@example.com"));
```
## Order AST
```rust
use cratestack_sql::{Order, OrderBy};
let order = OrderBy {
column: "createdAt",
direction: Order::Desc,
};
```
## Dialect Trait
```rust
use cratestack_sql::Dialect;
// Only varies on placeholder syntax
let dialect = Dialect::Postgres; // $1, $2, ...
let dialect = Dialect::Sqlite; // ?, ?, ...
```
## Model Descriptor
```rust
use cratestack_sql::ModelDescriptor;
// Generated by include_schema!
let model = &cratestack_schema::USER_MODEL;
// Contains table name, columns, relations
println!("table: {}", model.table_name);
```
## See Also
- `cratestack-sqlx` - Postgres backend (async)
- `cratestack-rusqlite` - SQLite backend (sync, on-device)
## License
MIT