Camada de banco

lxdb

Converse com seu banco, tipado

Camada de banco de dados para Lx inspirada no Ecto. Descreva seus dados com schemas e associações, monte queries por composição, execute-as pelo Repo, envolva o trabalho em transações e evolua o schema com migrations. Baseada em adaptadores — Postgres e SQLite hoje.

v0.1.0 ~70% completo

Highlights

  • Schemas & tipos de campo
  • Associações (belongs_to / has_many / has_one)
  • Queries composáveis
  • Agregados (count / sum / avg / min / max)
  • Transações
  • Baseada em adaptadores (Postgres, SQLite)

Features

Schemas

Declare uma tabela, seus campos e tipos (integer, string, uuid, json, datetime...) com opções como chave primária, unique, nullable e default — tudo num só lugar.

Associações

belongs_to, has_many e has_one descrevem relações entre schemas e geram as chaves estrangeiras certas.

Queries composáveis

Monte queries com pipe: where / or_where / order_by / limit / offset / join (inner, left, right, full, cross) / group_by / having / distinct. Inspecione o SQL com to_sql.

Agregados

count, sum, avg, min e max como expressões de select — tipados e composáveis como o resto da query.

Repo & transações

all / get / get_by / insert / insert_all / update / delete por um Repo supervisionado. Envolva trabalho em vários passos em transaction e transaction_batch com rollback.

Migrations

Migration structs versionadas com listas up/down; ensure_migrations_table, applied_migrations, migrate_up/down levam o schema pra frente com segurança.

Examples

Schema com associações

require "lxdb_schema"

def user_schema do
  lxdb_schema:new("users")
    |> lxdb_schema:field(:name, :string, %{nullable: false})
    |> lxdb_schema:field(:email, :string, %{unique: true})
    |> lxdb_schema:field(:age, :integer)
    |> lxdb_schema:has_many(:posts, :post_schema)
end

Query composável + SQL

require "lxdb_query"

q = lxdb_query:from(user_schema())
  |> lxdb_query:where({:ilike, :name, "a%"})
  |> lxdb_query:order_desc(:name)
  |> lxdb_query:limit(10)

{:ok, {sql, params}} = lxdb_query:to_sql(q)
# SELECT * FROM users WHERE name ILIKE ? ORDER BY name DESC LIMIT 10;

Repo: insert / update / delete

require "lxdb"

lxdb:insert(:lxdb_repo, user_schema(), %{name: "Ada", email: "ada@x.io", age: 36})
lxdb:update(:lxdb_repo, user_schema(), %{age: 37}, [{:==, :name, "Ada"}])
lxdb:all(:lxdb_repo, q)
lxdb:delete(:lxdb_repo, user_schema(), [{:==, :name, "Ada"}])

Transação

lxdb:transaction(:lxdb_repo, fn(_repo) do
  lxdb:insert(:lxdb_repo, user_schema(), %{name: "A"})
  lxdb:insert(:lxdb_repo, user_schema(), %{name: "B"})
end)

Migration

require "lxdb"

up = [
  "CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL);",
  "CREATE INDEX idx_users_email ON users(email);"
]
m = %lxdb:Migration{version: 20260101000000, up: up, down: ["DROP TABLE users;"]}
lxdb:migrate_up(:lxdb_repo, m)

Install

# project.yml
dependencies:
  lxdb:
    path: ../../lx_libs/lxdb
  lxdb_postgres:
    path: ../../lx_libs/lxdb/adapters/postgres
  # ou lxdb_sqlite para SQLite