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.
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.
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.
belongs_to, has_many e has_one descrevem relações entre schemas e geram as chaves estrangeiras certas.
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.
count, sum, avg, min e max como expressões de select — tipados e composáveis como o resto da query.
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.
Migration structs versionadas com listas up/down; ensure_migrations_table, applied_migrations, migrate_up/down levam o schema pra frente com segurança.
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
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;
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"}])
lxdb:transaction(:lxdb_repo, fn(_repo) do
lxdb:insert(:lxdb_repo, user_schema(), %{name: "A"})
lxdb:insert(:lxdb_repo, user_schema(), %{name: "B"})
end)
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)
# project.yml
dependencies:
lxdb:
path: ../../lx_libs/lxdb
lxdb_postgres:
path: ../../lx_libs/lxdb/adapters/postgres
# ou lxdb_sqlite para SQLite