SQL com os tipos do SQLite
Afinidade por coluna, as cinco classes de valor, aritmética, LIKE, IN, BETWEEN e as mesmas conversões que o SQLite faz.
Inspirado no SQLite, com JOINs, agregação, subconsultas, transações que sobrevivem a quedas de energia e modo WAL. Um único arquivo, sem servidor.
[ 01 / Resposta rápida ]
O EDSQLite é um banco de dados relacional embutido, inspirado no SQLite e escrito do zero em Rust. O banco inteiro fica num único arquivo e roda dentro do programa, sem servidor. Ele segue a arquitetura do SQLite (parser, VM de bytecode, B-tree e pager) e dá os mesmos resultados que o SQLite 3.53 no SQL que implementa, conferido em mais de 8 milhões de consultas. A versão atual, 0.9, é um pré-lançamento gratuito para macOS e Linux.
unsafe[ 02 / Status ]
Dá para usar, mas ainda não é uma versão estável. A 0.9 serve para experimentar, aprender e trabalhar com dados que você pode recriar. Para dados que não podem ser perdidos, espere a v1.0: até lá, o formato do arquivo ainda pode mudar, sem migração.
kill -9.prepare/bind/step).LEFT JOIN, UNION, CASE, CAST, ALTER TABLE e várias funções.[ 03 / Recursos ]
Tudo o que está aqui foi comparado com o SQLite de verdade, resultado por resultado.
Afinidade por coluna, as cinco classes de valor, aritmética, LIKE, IN, BETWEEN e as mesmas conversões que o SQLite faz.
JOIN ... ON, vírgula e CROSS JOIN, com count, sum, avg, min, max, group_concat, GROUP BY, HAVING e DISTINCT.
Escalares, IN (SELECT ...) e EXISTS, correlacionadas ou não, em qualquer parte do comando.
Índices B-tree simples, compostos e UNIQUE. O planner escolhe entre varredura, índice e rowid, e mostra tudo no EXPLAIN QUERY PLAN.
BEGIN, COMMIT e ROLLBACK com rollback journal: um crash no meio deixa o banco como estava antes.
Várias conexões, em threads ou processos, com busy_timeout. No modo WAL, quem lê não bloqueia quem escreve.
[ 04 / Em números ]
Com testes diferenciais: SQL gerado ao acaso roda no EDSQLite e no SQLite real, e as respostas precisam ser idênticas, valor por valor e tipo por tipo.
Expressões, índices, JOINs de até três tabelas, agregação, subconsultas e DISTINCT, em milhões de rodadas geradas ao acaso.
Uma falha simulada em cada escrita e cada fsync: o banco reabre sempre no estado de antes ou de depois da transação.
kill -9 de verdadeCem rodadas matando o processo no meio de commits, sem nenhuma transação pela metade ou perdida.
Consultas de relatório sobre 10 mil itens, com JOIN de três tabelas, HAVING e EXISTS, dão exatamente o resultado do SQLite.
Fonte: suíte de testes do EDSQLite na versão 0.9.0 (setembro de 2026), com o SQLite 3.53.2 como oráculo.
[ 05 / Instalar ]
Leva uns dois minutos no terminal.
.tar.gz do seu sistema na última versão.edsqlite num diretório do seu PATH.edsqlite dados.db. Sem arquivo, ele usa um banco em memória.# baixe edsqlite-0.9.0-macos-arm64.tar.gz e então: tar xzf edsqlite-0.9.0-macos-arm64.tar.gz sudo mv edsqlite /usr/local/bin/ # o binário não é assinado pela Apple: xattr -d com.apple.quarantine /usr/local/bin/edsqlite edsqlite --version
# baixe edsqlite-0.9.0-macos-x86_64.tar.gz e então:
tar xzf edsqlite-0.9.0-macos-x86_64.tar.gz
sudo mv edsqlite /usr/local/bin/
xattr -d com.apple.quarantine /usr/local/bin/edsqlite
edsqlite --version
# x86_64 ou arm64 (binário estático, roda em qualquer distro):
tar xzf edsqlite-0.9.0-linux-x86_64.tar.gz
sudo mv edsqlite /usr/local/bin/
edsqlite --version
Confira os arquivos com o SHA256SUMS da release: shasum -a 256 -c SHA256SUMS. No REPL, os comandos terminam em ;; também há .tables, .indexes, .headers on e .exit.
[ 06 / Roadmap ]
A próxima parada é a v1.0, a primeira versão estável. Depois, os recursos de SQL que mais fazem falta.
prepare, bind, step, com ? e :nome), para programas usarem o banco sem montar SQL como texto e sem risco de SQL injection.NOT NULL, DEFAULT, INTEGER PRIMARY KEY, CHECK e chaves estrangeiras.LEFT JOIN, UNION, CASE, CAST, subconsultas no FROM e WITH.substr, replace, trim, de data e hora e de janela.ALTER TABLE, views e COLLATE.VACUUM e transações maiores que a memória.[ 07 / Perguntas frequentes ]
O EDSQLite é um banco de dados relacional embutido, inspirado no SQLite e escrito do zero em Rust, sem código copiado do SQLite. O banco inteiro fica num único arquivo e roda dentro do programa que o usa, sem servidor.
Ainda não. A versão 0.9 é um pré-lançamento: dá para experimentar, aprender e trabalhar com dados que podem ser recriados. O formato do arquivo ainda pode mudar antes da v1.0, sem migração, então não é recomendado para dados que não podem ser perdidos.
Não. O EDSQLite usa um formato de arquivo próprio, inspirado no do SQLite. O que é compatível é a linguagem: o SQL suportado dá os mesmos resultados que o SQLite 3.53, conferido em mais de 8 milhões de consultas geradas.
É gratuito. Os binários para macOS e Linux são baixados diretamente do GitHub Releases, sem conta e sem cadastro.
macOS (Apple Silicon e Intel) e Linux (x86_64 e ARM64, com binário estático). Windows ainda não tem binário, e os locks entre conexões ainda não existem nele.
CREATE TABLE, CREATE INDEX, DROP, INSERT, UPDATE, DELETE e SELECT com WHERE, ORDER BY, LIMIT, JOIN, CROSS JOIN, GROUP BY, HAVING, DISTINCT, subconsultas (escalar, IN e EXISTS), agregados (count, sum, total, avg, min, max, group_concat), transações e PRAGMAs de journal e checkpoint. Ainda faltam restrições (NOT NULL, DEFAULT, INTEGER PRIMARY KEY), LEFT JOIN, UNION, CASE, CAST e ALTER TABLE.
Sim. Cada commit é atômico, por rollback journal ou pelo modo WAL: um crash no meio deixa o banco como estava antes da transação. Isso é testado com uma falha simulada em cada operação de disco e com o processo morto por kill -9 no meio de commits.
Por enquanto o EDSQLite é distribuído como um executável de linha de comando (um REPL, como o shell do SQLite). A API estável para programas, com parâmetros (prepare, bind, step), é a principal entrega da v1.0.
O SQLite é o banco embutido de referência, maduro e com décadas de uso. O EDSQLite é uma implementação independente, em Rust, que segue a mesma arquitetura (parser, VM de bytecode, B-tree, pager) e reproduz os resultados do SQLite no SQL que implementa. Ele cobre um subconjunto do SQL e ainda não é estável.
Baixe o binário, abra um banco e rode seu primeiro SELECT. Se encontrar algo estranho, abra uma issue: é assim que a v1.0 fica mais sólida.