Conjunto de comandos implementados en Python para facilitar tareas relacionadas con bases de datos relacionales, accesibles todos a través de un único comando dbtools:
dbtools analyzer: Analiza la estructura de una base de datos usando IA, obteniendo información semántica de las tablas y columnas.dbtools checker: Verifica la integridad de una base de datos. [Próximamente]dbtools code: Lista, busca y extrae procedimientos y funciones almacenadas en formato SQL o JSON.dbtools config: Crea y gestiona los ficheros de configuración con las conexiones a las bases de datos.dbtools ddrsearch: Extrae información de un DDR (Data Dictionary Report) de una base de datos Oracle.dbtools mapper: Crea mapas entre esquemas de bases de datos para facilitar la migración de datos.dbtools orm: Genera clases ORM (SQLAlchemy) a partir del esquema de la base de datos.dbtools query: Ejecuta consultas SQL directas o generadas a partir de lenguaje natural con IA.dbtools schema: Genera un esquema de la base de datos en formato JSON.
😱 Útil para no amargarte la vida.
Para instalar dbtools en tu sistema, puedes hacerlo desde el repositorio de GitHub con el comando pip (debes ejecutarlo como Administrador en Windows o con sudo en Linux):
pip install git+https://github.com/fvarrui/dbtools.git🐍 Por supuesto, debes tener Python instalado en tu sistema.
Si ya has instalado alguna versión de dbtools, puedes actualizarlo con el siguiente comando:
pip install --upgrade --force-reinstall --no-cache-dir git+https://github.com/fvarrui/dbtools.gitTodos los comandos cuelgan de dbtools, en forma de subcomandos. Ejecuta dbtools --help para ver el listado completo, y dbtools <subcomando> --help para la ayuda de cada uno.
dbtools --help
dbtools {subcomando} --helpℹ️ Remplaza
{subcomando}por el subcomando que quieras usar, por ejemploschema,analyzer, etc.
Para obtener más información sobre cada subcomando, consultar la documentación correspondiente.
Las conexiones a la base de datos se configuran en el archivo de configuración $HOME/.dbtools/dbtools.ini y usando la opción --db-name, o bien proporcionando la cadena de conexión con la opción --db-url en la línea de comandos.
Ejemplo de archivo de configuración dbtools.ini:
[database]
type=<mysql|postgresql|mssql>
host=<server>
port=<port>
username=<username>
password=<password>
database=<database name>
driver=<driver>
trusted_connection=<yes|no>Warning
- Si no se proporciona
port, se usará el puerto por defecto para el tipo de base de datos especificado. - Si no se proporciona
passworden el archivo de configuración, se solicitará al usuario. - Las opciones
driverytrusted_connectionson específicas de SQL Server.
dbtools {subcomando} --db-name database <opciones>ó
dbtools {subcomando} --db-url postgresql://user:password@host:port/database <opciones>Siendo database el nombre de la sección en el archivo de configuración.
Cadenas de conexión para los distintos sistemas gestores de bases de datos soportados:
| Sistema | Cadena de conexión |
|---|---|
| PostgreSQL | postgresql://{USER}:{PASSWORD}@{SERVER}:{PORT}/{DB_NAME} |
| MySQL | mysql://{USER}:{PASSWORD}@{SERVER}:{PORT}/{DB_NAME} |
| SQL Server (SQL Server Authentication) | mssql://{USER}:{PASSWORD}@{SERVER}:{PORT}/{DB_NAME}?driver={DRIVER} |
| SQL Server (Windows Authentication) [SSPI] | mssql://{SERVER}:{PORT}/{DB_NAME}?driver={DRIVER}&trusted_connection=yes |
Detalle y ejemplos de cada subcomando de dbtools. Para el listado completo de opciones de cada uno, usa dbtools <subcomando> --help.
Analizador semántico de bases de datos: utiliza la API de OpenAI para obtener información descriptiva sobre las tablas y columnas.
Analizar una tabla específica y exportar el resultado a un fichero JSON:
dbtools analyzer --db-name PincelPreDB --output schemas --analyze-table PEC_EvalCalificacionesAnalizar todas las tablas con prefijo PEC_ y exportar los resultados al directorio schemas:
dbtools analyzer --db-name PincelPreDB --output schemas --analyze-schema PEC_
⚠️ Próximamente. Comprobará la integridad de una base de datos relacional: ciclos en las relaciones entre tablas y tablas sin relaciones.
Lista, busca y extrae procedimientos y funciones almacenadas en una base de datos relacional. Pensado para inventariar el código que vive dentro del SGBD y exportarlo como ficheros .sql o JSON, de manera que pueda versionarse, revisarse o usarse como entrada de otras herramientas.
Soporta los siguientes dialectos:
- PostgreSQL
- MySQL / MariaDB
- SQL Server (T-SQL)
Los argumentos [FILTER] filtran por substring del nombre de la rutina (case-insensitive). Si no se indican, se muestran todas.
Combinaciones de salida:
| Comando | --json FILE |
--json (sin fichero) |
--output DIR |
sin opciones |
|---|---|---|---|---|
--list-* |
JSON a fichero | JSON a stdout | .sql por rutina |
Tabla resumen |
--extract |
JSON a fichero | JSON a stdout | .sql por rutina |
Tabla + SQL en stdout |
--search |
JSON a fichero | JSON a stdout | .sql por rutina |
Tabla + SQL en stdout |
ℹ️ Si se combina
--json(sin fichero) con--output DIR, prevalece--output(genera ficheros.sql).
Ejemplos:
# Listar todos los procedimientos de la base de datos mydb
dbtools code --db-name mydb --list-procedures
# Listar funciones cuyo nombre contenga "audit"
dbtools code --db-name mydb --list-functions audit
# Extraer todos los procedimientos y funciones a un directorio (un .sql por cada uno)
dbtools code --db-name mydb --extract --output ./routines
# Extraer sólo las rutinas cuyo nombre contenga "usr_" y guardarlas como JSON
dbtools code --db-name mydb --extract usr_ --json routines.json
# Buscar todas las rutinas que mencionen una tabla concreta en su cuerpo
dbtools code --db-name mydb --search "TBL_USUARIOS"Formato JSON de cada rutina:
{
"name": "fn_calcular_total",
"type": "FUNCTION",
"schema_name": "public",
"language": "plpgsql",
"return_type": "numeric",
"definition": "CREATE OR REPLACE FUNCTION ..."
}type:"PROCEDURE"o"FUNCTION".language/return_type: dependen del SGBD; pueden sernull.definition: SQL completo del procedimiento o función.
Origen de los datos por dialecto:
| SGBD | Origen de los datos |
|---|---|
| PostgreSQL | pg_proc + pg_get_functiondef() (incluye CREATE OR REPLACE) |
| MySQL | information_schema.ROUTINES (sólo cuerpo, sin CREATE) |
| SQL Server | sys.sql_modules + sys.objects (definición tal cual creada) |
⚠️ En MySQL la columnaROUTINE_DEFINITIONcontiene únicamente el cuerpo (sin la cabeceraCREATE PROCEDURE …). Si necesitas la sentencia completa, usaSHOW CREATE PROCEDURE namedesde un cliente MySQL.
Crea y gestiona los ficheros de configuración de dbtools (config.ini y dbtools.ini) y las conexiones a bases de datos que contiene este último.
# Crea el fichero de configuración global (config.ini, API keys, etc.)
dbtools config --create-config
# Crea/gestiona interactivamente el fichero de conexiones (dbtools.ini)
dbtools config --create-db-config
# Añade una nueva conexión a ~/.dbtools/dbtools.ini; los datos que falten se piden por consola
dbtools config --add mydb --type mysql --host localhost --port 3306 --database mydb --username admin
# Lista las conexiones configuradas
dbtools config --list
# Muestra la configuración completa de una conexión (contraseña censurada)
dbtools config --show mydb
# Prueba una conexión
dbtools config --test-connection --db-name mydb
# Devuelve la URL de conexión resuelta para una conexión
dbtools config --get-url --db-name mydb🔒 La contraseña nunca se acepta por línea de comandos (ni en
--addni en ningún otro subcomando): siempre se solicita de forma interactiva.
Extrae información de un DDR (Data Dictionary Report) exportado de una base de datos Oracle: esquema, tablas, columnas y relaciones.
# Extraer el esquema de la base de datos en formato JSON
dbtools ddrsearch --ddr-dir path/to/ddr/tables --schema --json mydb-schema.json
# Mostrar el detalle de una tabla
dbtools ddrsearch --ddr-dir path/to/ddr/tables --table CENTROS
# Listar las tablas que contienen "CENTROS" en el nombre
dbtools ddrsearch --ddr-dir path/to/ddr/tables --list-tables ^.*CENTROS.*$
# Tablas referenciadas por CENTROS (recursivo hasta 2 niveles)
dbtools ddrsearch --ddr-dir path/to/ddr/tables --used-by CENTROS --limit 2
# Tablas que referencian a CENTROS (recursivo hasta 2 niveles)
dbtools ddrsearch --ddr-dir path/to/ddr/tables --uses CENTROS --limit 2Genera el mapeo entre dos esquemas de bases de datos (previamente extraídos con dbtools schema), útil para traducir sentencias SQL de un esquema a otro o para migraciones de datos.
dbtools mapper --map --src-schema src-schema.json --dst-schema dst-schema.json --json result.jsonGenera clases ORM de SQLAlchemy (vía sqlacodegen) a partir del esquema de una base de datos.
# Generar las clases ORM de toda la base de datos en el directorio actual
dbtools orm --db-name mydb --gen-classes
# Generar sólo las clases de las tablas con prefijo "usr_" en un directorio concreto
dbtools orm --db-name mydb --gen-classes usr_ --output ./modelsEjecuta consultas SQL directas o desde un fichero, y muestra o guarda el resultado.
# Ejecutar una consulta SQL directa
dbtools query --db-name mydb --sql "SELECT * FROM usuarios WHERE activo = 1"
# Ejecutar una consulta SQL desde un fichero y guardar el resultado en JSON
dbtools query --db-name mydb --sql-file consulta.sql --json resultado.json
⚠️ --nat-lang(generar la consulta a partir de una petición en lenguaje natural con IA) está en desarrollo: por ahora no usa el texto ni el esquema indicados por línea de comandos.
Extrae esquemas de bases de datos a partir de sus metadatos y permite exportarlos en JSON, de manera que puedan usarse para su posterior análisis, documentación o como entrada de otros subcomandos (mapper, query, orm...).
# Generar el esquema completo de mydb en un fichero JSON
dbtools schema --db-name mydb --schema --json mydb-schema.json
# Generar en JSON (por consola) sólo las tablas que contengan "tbl" en el nombre
dbtools schema --db-name mydb --schema tbl --json
# Mostrar el esquema completo en formato de tablas por consola
dbtools schema --db-name mydb --schema
# Listar los nombres de las tablas
dbtools schema --db-name mydb --list-tablesSi quieres colaborar en el desarrollo de dbtools, puedes hacerlo de la siguiente manera.
Clonar el repositorio y entrar en el directorio:
git clone https://github.com/fvarrui/dbtools.git
cd dbtoolsCrear un entorno virtual:
python -m venv venvActivar el entorno virtual:
venv\Scripts\activateInstalar el paquete en modo de edición, de modo que se crearán los scripts del paquete y se instalarán las dependencias en el entorno virtual:
pip install -e .¡Y a programar!
code .¡Tus PRs son bienvenidos!
Made with ❤️ by fvarrui