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 Qubry DB é 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 16 milhões de consultas. A versão atual, 0.14, é um pré-lançamento gratuito para macOS e Linux, com o formato do arquivo já congelado.
unsafe[ 02 / Status ]
Dá para usar, e o formato do arquivo não muda mais. A 0.12 trouxe tudo o que estava planejado para a v1.0: o formato está congelado e documentado, e todo banco criado desde a 0.3 abre em todas as versões 1.x. Uma versão antiga que recebe um banco mais novo o recusa sem tocar nele. A 0.14 ainda sai como pré-lançamento, antes do selo de v1.0.
CASE, CAST e as funções de texto substr, replace e trim.NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY e INTEGER PRIMARY KEY.kill -9.prepare/bind/step), API C e driver JDBC para o DBeaver.CHECK, chaves estrangeiras, LEFT JOIN, UNION, views, 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.
NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY e INTEGER PRIMARY KEY, que é o próprio rowid, como no SQLite. O PRAGMA table_info mostra tudo.
CASE com e sem base, CAST para os cinco tipos e as funções substr, replace, trim, ltrim e rtrim, com os mesmos detalhes do SQLite.
Í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.
prepare, bind e step, com parâmetros ?, ?N e :nome. Um comando preparado é recompilado sozinho quando outra conexão muda o schema.
O arquivo está documentado byte a byte e congelado. Os códigos de erro têm os números do SQLite (BUSY, CONSTRAINT, NOTADB...).
No formato da API C do SQLite (edsqlite_open, prepare_v2, step, bind_*, column_*), com header para C e C++. É o caminho para drivers em outras linguagens.
Abre bancos do Qubry DB no DBeaver como se abre um SQLite (jdbc:edsqlite:{file}), sem Java instalado. O .jar já traz a biblioteca de macOS e Linux.
[ 04 / Em números ]
Com testes diferenciais: SQL gerado ao acaso roda no Qubry DB 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.
6106 consultas do corpus oficial de conformidade do SQLite, com as respostas que o próprio SQLite deu.
Cada script de teste roda com um crash simulado em cada operação de I/O: uns 5800 crashes a cada execução.
SQL arbitrário e arquivos de banco corrompidos, todas as noites: nunca um panic, só erros.
94,7% das linhas cobertas pelos testes, com metas mínimas nos módulos de armazenamento e da VM.
Fonte: suíte de testes do Qubry DB na versão 0.14.0 (outubro 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.14.0-macos-arm64.tar.gz e então: tar xzf edsqlite-0.14.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.14.0-macos-x86_64.tar.gz e então:
tar xzf edsqlite-0.14.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.14.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.
DBeaver: baixe o edsqlite-jdbc-<versão>.jar da mesma release e cadastre-o uma vez em Database → Driver Manager → New (Driver Type Generic, Class Name br.edsqlite.jdbc.EDSQLiteDriver, URL Template jdbc:edsqlite:{file}, Embedded, e o .jar em Libraries). Depois, é como no SQLite: nova conexão, o caminho do arquivo e Finish.
Biblioteca C: os pacotes edsqlite-capi-<versão>-<sistema>.tar.gz trazem include/edsqlite.h e a biblioteca (.dylib ou .so, e .a). A de Linux usa a glibc 2.34 ou mais nova.
[ 06 / Roadmap ]
O que estava planejado para a v1.0 ficou pronto na 0.12. Agora vêm os recursos de SQL que mais fazem falta e mais plataformas.
CASE, CAST e funções de texto (v0.10).NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY e INTEGER PRIMARY KEY (v0.11).prepare, bind, step, com ?, ?N e :nome), para programas usarem o banco sem montar SQL como texto.br.edsqlite.jdbc.EDSQLiteDriver na v0.14).last_insert_rowid, total_changes, PRAGMA index_list e index_info.EXPLAIN QUERY PLAN; REAL vira texto como no SQLite 3.53 (v0.14).CHECK, AUTOINCREMENT, chaves estrangeiras e ON CONFLICT.LEFT JOIN, UNION, subconsultas no FROM e WITH.instr, printf, 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 Qubry DB é 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.
Dá para usar. A versão 0.14 ainda sai como pré-lançamento, antes do selo de v1.0, mas o formato do arquivo está congelado e documentado desde a 0.12: todo banco criado desde a 0.3 abre em todas as versões 1.x, e uma versão antiga recusa um banco mais novo sem tocar nele.
Não. O Qubry DB 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 16 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. Também CASE, CAST, as funções de texto substr, replace e trim, e as restrições NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY e INTEGER PRIMARY KEY. Ainda faltam CHECK, chaves estrangeiras, LEFT JOIN, UNION 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.
Sim. Além do executável de linha de comando (um REPL, como o shell do SQLite), cada versão traz a biblioteca com uma API C no formato da do SQLite (prepare, bind, step, com parâmetros ? e :nome, e header para C e C++) e um driver JDBC, que abre bancos do Qubry DB no DBeaver.
O SQLite é o banco embutido de referência, maduro e com décadas de uso. O Qubry DB é 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 está em pré-lançamento.
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.