Plataforma genérica de conversão/análise/migração entre bancos de dados via Intermediate Representation (IR) canônica — SQLite, PostgreSQL, MySQL (em progresso), SQL Server (planejado).
Project description
DBBridge
Plataforma genérica de conversão, análise e migração entre bancos de dados, baseada numa Intermediate Representation (IR) canônica — não um conversor pareado por combinação de bancos.
Banco origem → Parser do dialeto origem → IR canônica → Renderer do dialeto destino → Banco destino
Evolução do PostgresModel generalizada: em vez de assumir SQLite→PostgreSQL sempre, qualquer par de dialetos suportados passa pelo mesmo pipeline.
Status (Fase 1)
| Dialeto | Parser | Renderer |
|---|---|---|
| SQLite | ✅ | ✅ |
| PostgreSQL | ✅ | ✅ |
| MySQL | estrutura registrada (Fase 2) | estrutura registrada (Fase 2) |
| SQL Server | estrutura registrada (Fase 5) | estrutura registrada (Fase 5) |
dbbridge.dialects.mysql/sqlserver já registram um dialeto "conhecido, ainda não implementado" —
dbbridge dialects lista os dois, e chamar .parse()/.render_schema() neles levanta
NotImplementedError com a fase planejada, em vez de um erro genérico de dialeto desconhecido.
167 testes, 99% de cobertura (pytest --cov=dbbridge). Os poucos pontos não cobertos são código
genuinamente inalcançável (stubs de método abstrato, guard if __name__ == "__main__") — ver
docs/guide.md.
Instalação
pip install -e .
# ou, pra rodar contra PostgreSQL de verdade:
pip install -e ".[dev]"
Uso rápido
Traduzir um schema
dbbridge translate --from sqlite --to postgres schema.sql
Casos que o parser/renderer não reconhecem com segurança viram REVIEW_REQUIRED no stderr — nunca
uma tradução inventada.
Escanear um projeto Python
dbbridge scan --from sqlite --to postgres ./meu_projeto
Encontra execute()/executemany() com SQL potencialmente incompatível entre os dois dialetos:
placeholders (? vs %s), sqlite_master, PRAGMA, INSERT OR IGNORE/OR REPLACE,
case-sensitivity de LIKE, autoincrement, e mais.
Migrar código-fonte automaticamente
dbbridge patch --from sqlite --to postgres ./meu_projeto # dry-run, mostra o plano
dbbridge apply --from sqlite --to postgres ./meu_projeto # aplica com backup automático
dbbridge rollback ./meu_projeto # desfaz, restaura do backup
Reescreve só literais de string simples sem ambiguidade (troca de placeholder). f-strings,
concatenação e casos ambíguos (aspas duplas, INSERT OR REPLACE, etc.) nunca são alterados
automaticamente — viram REVIEW_REQUIRED/SKIPPED_COMPLEX_EXPRESSION no plano.
Migrar dados entre bancos de verdade
dbbridge migrate-data --from sqlite --to postgres \
--source-dsn ./app.db --target-dsn "host=localhost dbname=app" --tables users leads
dbbridge validate --from sqlite --to postgres \
--source-dsn ./app.db --target-dsn "host=localhost dbname=app" --tables users leads
Copia em lotes, nunca faz DROP/TRUNCATE, sempre acrescenta. validate compara contagens e
checksum (SHA-256) linha a linha quando a tabela é pequena o bastante.
Compatibility Mode (código antigo continua rodando)
from dbbridge import connect
db = connect(source_dialect="sqlite", target_dialect="postgres", dsn="host=localhost dbname=app")
db.execute("SELECT * FROM users WHERE id=?", (1,)) # vira %s por baixo, roda no Postgres de verdade
Permite migrar a aplicação por partes: o código continua escrito na sintaxe de origem enquanto o banco de verdade já é o destino.
Exemplos executáveis
python examples/translate_schema.py # traduz um schema via API Python
python examples/scan_and_patch_project.py # scan -> patch -> apply -> rollback num mini-app
python examples/compat_mode.py # Compatibility Mode de ponta a ponta
DBBRIDGE_EXAMPLE_PG_DSN="host=localhost dbname=..." python examples/full_data_migration.py
Todos os quatro rodam de verdade (não são pseudocódigo) — os três primeiros só precisam do SQLite da stdlib; o último precisa de um PostgreSQL acessível via a variável de ambiente indicada.
Arquitetura
dbbridge/
cli.py # scan|report|translate|patch|apply|migrate-data|validate|rollback|doctor|dialects
core/
ir.py # Schema, Table, Column, ForeignKey, UniqueConstraint, CheckConstraint, Index, View, Trigger, Enum
types.py # CanonicalType, Ambiguity
parser.py / renderer.py # contratos + registry (register_parser/get_parser/available_parsers, idem renderer)
planner.py # translate(sql, source, target) — o pipeline completo numa função
dialects/
sqlite.py, postgres.py # implementados
mysql.py, sqlserver.py # stubs registrados (NotImplementedError com a fase planejada)
scanner/scanner.py # AST — encontra SQL arriscado por par de dialetos
codemod/codemod.py # AST — reescreve só literais simples sem ambiguidade
migration/
schema_migration.py # traduz + aplica DDL (aditivo, nunca DROP/TRUNCATE)
data_migration.py # copia dados em lotes
validator.py # contagens + checksum
rollback.py # restaura código a partir de backup
compat/runtime.py # connect() — Compatibility Mode
reports/report.py # normaliza qualquer resultado pra texto/JSON
Por que IR em vez de conversores pareados: com N dialetos, um conversor direto por par cresce O(N²) e duplica a mesma lógica de tipos/constraints em cada combinação. Com um modelo canônico no meio, cada dialeto novo precisa de só 1 parser + 1 renderer (O(N)) pra já converter de/para todos os outros já implementados.
Segurança
- Toda alteração de código gera backup antes de escrever, e pode ser revertida via
dbbridge rollback. - Migração de schema/dados é sempre aditiva — nunca
DROP/TRUNCATE/DELETE. - Casos ambíguos (aspas duplas em literal,
INSERT OR REPLACE, f-strings, expressões dinâmicas) nunca são "adivinhados" — viramREVIEW_REQUIREDpra revisão manual. apply_changesverificaast.parse()do arquivo resultante antes de considerar sucesso; se o resultado tiverSyntaxError, reverte sozinho a partir do backup.
Fases
- IR + SQLite ↔ PostgreSQL — atual, completo: parser/renderer dos dois dialetos, scanner, codemod, migração de schema/dados, validação por checksum, rollback, CLI, Compatibility Mode.
- MySQL (parser + renderer reais).
- Codemod genérico validado contra os 3 dialetos.
- Data migration validada nos 4 pares centrais (SQLite/Postgres/MySQL cruzados).
- SQL Server.
- Fases futuras (levantadas, ainda não priorizadas): shadow migration (rodar origem e destino
em paralelo comparando resultados antes do cutover final), query replay (reproduzir tráfego real
de produção contra o destino como teste de carga/compatibilidade), dashboard web, relatórios em
HTML/PDF (hoje só texto/JSON via
reports/report.py), mecanismo de plugin formal pra dialetos externos (hoje a extensão já é possível viaregister_parser/register_renderer— falta só empacotar como plugin instalável separadamente, ex. entry points do Python), e suporte a bancos não-relacionais como MongoDB (exigiria uma IR paralela pra documentos/coleções — ver docs/compatibility-matrix.md).
Cada fase só avança depois da anterior validada — ver docs/guide.md para detalhes de arquitetura e extensão pra novos dialetos, docs/cli-reference.md pra todos os comandos, docs/compatibility-matrix.md pro que já funciona vs. planejado, docs/migration-tutorial.md pro passo a passo completo, e docs/production-checklist.md antes de rodar contra dados reais.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dbbridgekit-0.1.0.tar.gz.
File metadata
- Download URL: dbbridgekit-0.1.0.tar.gz
- Upload date:
- Size: 49.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2e8c2946f5a9491f8143fccebfaca764a42313473181de8567b15bd996e88b6
|
|
| MD5 |
ff8b726b3e6890f0292a0fb5c2e915f0
|
|
| BLAKE2b-256 |
11c7ead2dbdd928c6638e6e738f64bb385d198afd27cd92f183b699b175f0747
|
File details
Details for the file dbbridgekit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dbbridgekit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b854dc5b31004dd0e9380cddea10bf1499c5b788599cbb37447322671ea36034
|
|
| MD5 |
ae2f826bd9a2850fbf2f8550ffd51edc
|
|
| BLAKE2b-256 |
a1e0eaaff827d3022306498abe610d6088765826020a958c017d60c49578dc88
|