SQLite mejorado con cifrado SQLCipher y API REST asincrónica con FastAPI
Project description
SQLitePlus Enhanced
SQLitePlus Enhanced es una caja de herramientas en Python que facilita el trabajo con bases de datos SQLite. Puedes usarla para levantar una API con FastAPI o para gestionar la base desde la línea de comandos sin escribir código adicional.
✨ Qué incluye
- 🔄 Manejo seguro de varias bases SQLite desde tareas asíncronas.
- 🔐 Inicio de sesión mediante JSON Web Tokens con contraseñas hasheadas con
bcrypt. - 🔑 Compatibilidad opcional con SQLCipher tanto en la API como en la consola.
- 💾 Utilidades sencillas para exportar tablas a CSV y crear copias de seguridad automáticas.
- 🧰 Comando
sqlitepluscon subcomandos claros para tareas diarias.
📦 Instalación rápida
- Asegúrate de tener Python 3.10 o superior.
- Instala la librería:
pip install sqliteplus-enhanced
¿Vas a colaborar con el código? Instálala en modo editable y añade las dependencias de desarrollo:
pip install -e '.[dev]'
Nota: Las comillas simples evitan que shells como
zshintenten expandir los corchetes, lo que podría provocar errores al instalar los extras.
Si solo quieres experimentar con la librería dentro del repositorio puedes mantener la instalación mínima:
pip install -e .
¿Qué pasa con bcrypt?
El paquete incluye una implementación pura en Python que se activa automáticamente si el intérprete no puede importar el módulo oficial. Así, las funciones de autenticación siguen operativas aunque no tengas compiladores o binarios nativos disponibles.
Los hashes generados por el fallback llevan el prefijo compatbcrypt$. Aunque más adelante instales la extensión oficial, SQLitePlus detecta ese prefijo durante la autenticación y delega la verificación en sqliteplus._compat.bcrypt, por lo que puedes mezclar contraseñas nuevas con antiguas sin romper el inicio de sesión.
Si quieres usar la extensión oficial siempre que el entorno lo permita, instala el extra opcional security:
pip install "sqliteplus-enhanced[security]"
Cuando el intérprete detecta bcrypt, automáticamente sustituye el fallback por el módulo nativo. Si deseas migrar las contraseñas antiguas al backend oficial basta con recalcular el hash y actualizar el JSON de usuarios. Un script simple podría iterar por cada entrada con compatbcrypt$, verificar la contraseña original (por ejemplo solicitándola al usuario) y escribir un nuevo hash con bcrypt.hashpw(password.encode(), bcrypt.gensalt()). Mientras tanto, ambas variantes seguirán funcionando de forma transparente.
🔐 Configuración mínima
Guarda tus claves como variables de entorno para evitar dejarlas en el código.
Variables obligatorias para la API y la autenticación
| Variable | Para qué sirve |
|---|---|
SECRET_KEY |
Firmar los tokens JWT expuestos por la API. |
SQLITEPLUS_USERS_FILE |
Ubicación del JSON con usuarios y contraseñas hasheadas con bcrypt. Es obligatoria solo cuando levantas la API o usas la autenticación integrada. |
Variables opcionales (API y CLI)
| Variable | Para qué sirve |
|---|---|
SQLITE_DB_KEY |
Clave SQLCipher para abrir bases cifradas desde la API o la CLI. |
SQLITEPLUS_FORCE_RESET |
Valores como 1, true o on fuerzan el borrado del archivo SQLite antes de recrear la conexión. |
Los comandos locales de la CLI no dependen de
SQLITEPLUS_USERS_FILE; puedes ejecutarsqliteplusen modo standalone sin definirlo.
Ejemplo rápido para generar valores seguros:
export SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
export SQLITE_DB_KEY=$(python -c "import secrets; print(secrets.token_hex(32))")
Crear un archivo de usuarios con el login admin:
python - <<'PY'
from sqliteplus._compat import ensure_bcrypt
import json, pathlib
bcrypt = ensure_bcrypt()
password = "admin"
hash_ = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
path = pathlib.Path("users.json")
path.write_text(json.dumps({"admin": hash_}, indent=2), encoding="utf-8")
print(f"Archivo generado en {path.resolve()}")
PY
export SQLITEPLUS_USERS_FILE="$(pwd)/users.json"
Si prefieres evitar scripts ad hoc puedes delegar la generación del hash en el
helper integrado, que ya usa internamente ensure_bcrypt() y solicita la
contraseña de forma segura cuando no se proporciona como argumento:
python -m sqliteplus.auth.users hash admin
# o bien (la contraseña se pedirá sin eco):
python -m sqliteplus.auth.users hash
Si ejecutas los comandos anteriores en una máquina sin compiladores o binarios
nativos, la importación ensure_bcrypt() activará el fallback puro Python de
forma transparente. Cuando quieras forzar el backend nativo instala el extra
security (pip install "sqliteplus-enhanced[security]").
🚀 Levantar la API
uvicorn sqliteplus.main:app --reload
Una vez en marcha tendrás disponible la documentación interactiva en:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
🧪 Ejecutar las pruebas
Instala primero las dependencias de desarrollo para disponer de todas las herramientas usadas en la suite:
pip install -e '.[dev]'
pytest -v
Cuando detecta pytest, AsyncDatabaseManager borra y recrea las bases ubicadas en databases/ antes de abrirlas en lugar de moverlas a carpetas temporales. La detección es perezosa: en cada get_connection() vuelve a comprobar PYTEST_CURRENT_TEST y la nueva variable SQLITEPLUS_FORCE_RESET, por lo que puedes pedir un reinicio incluso si el gestor global ya se creó (por ejemplo, desde la app FastAPI). Si activas SQLITEPLUS_FORCE_RESET mientras una conexión sigue abierta en el mismo bucle de eventos, el gestor la cierra, elimina el archivo .db y lo vuelve a crear antes de devolverte la conexión limpia. Revisa la reinicialización automática en pruebas o el código correspondiente en sqliteplus/core/db.py.
🛠️ Usar la CLI sqliteplus
El comando principal admite dos opciones globales:
--cipher-keyo la variableSQLITE_DB_KEYpara abrir bases cifradas.--db-pathpara indicar el archivo de base de datos que usarán todos los subcomandos.
Nota: Los subcomandos locales no consultan
SQLITEPLUS_USERS_FILE. Este archivo solo es necesario cuando expones la API protegida con JWT.
Si no se especifica --db-path, la CLI crea (o reutiliza) automáticamente el archivo
sqliteplus/databases/database.db dentro del directorio de trabajo actual, de modo
que no se modifica la base distribuida con el paquete.
Comandos disponibles:
sqliteplus init-dbcrea la base y deja constancia en la tablalogs.sqliteplus execute INSERT ...ejecuta instrucciones de escritura y muestra el último ID insertado cuando aplica.sqliteplus fetch SELECT ...muestra los resultados fila por fila, avisando si no hay datos.sqliteplus list-tablespresenta en una tabla rica todas las tablas disponibles y sus recuentos de filas.sqliteplus describe-table <tabla>resume las columnas, índices y relaciones de la tabla indicada.sqliteplus db-infomuestra un resumen del archivo activo (ruta, tamaño, tablas, vistas y filas totales).sqliteplus export-query ...ejecuta una consulta de lectura y guarda el resultado en JSON o CSV; consulta la guía detallada.sqliteplus export-csv <tabla> <archivo.csv>guarda la tabla en un CSV con encabezados y, por defecto, protege archivos existentes a menos que añadas--overwrite.sqliteplus backupgenera un respaldo fechado en la carpetabackups/. Puedes especificar otra ruta con--db-path.sqliteplus visual-dashboardabre el panel interactivo de FletPlus para explorar tablas, consultas y resultados en modo gráfico; admite banderas como--theme,--max-rows,--accent-colory--read-only/--allow-writepara personalizar el visor.
Todos los subcomandos y sus opciones se documentan en docs/cli.md; úsalo como índice de referencia rápida cuando necesites repasar los --flags disponibles.
Los subcomandos export-csv y backup muestran los resultados de forma visual con Rich, mientras que las utilidades internas solo devuelven la ruta generada. Así puedes reutilizar la API desde scripts externos sin producir mensajes duplicados: toda la salida visible procede de la CLI.
Activar el visor visual (extra opcional)
El paquete base evita instalar dependencias gráficas para mantener una huella ligera. Si deseas abrir el visor accesible de los subcomandos fetch o list-tables (--viewer) o aprovechar sqliteplus visual-dashboard, instala el extra opcional visual:
pip install "sqliteplus-enhanced[visual]"
Este extra añade Flet y FletPlus. Puedes instalarlo de forma combinada con otros extras (pip install sqliteplus-enhanced[dev,visual]).
Gracias a la integración con Rich todos los mensajes de la CLI se muestran con colores, paneles y tablas que facilitan su lectura y accesibilidad.
Ejemplo combinando opciones:
sqliteplus --db-path databases/demo.db --cipher-key "$SQLITE_DB_KEY" backup
🗂️ Estructura del proyecto
.
├── sqliteplus/ # Paquete instalable
│ ├── main.py # Punto de entrada FastAPI
│ ├── cli.py # Implementación del comando `sqliteplus`
│ ├── api/ # Endpoints REST protegidos
│ ├── auth/ # Gestión JWT y validaciones
│ ├── core/ # Servicios asincrónicos y modelos
│ └── utils/ # Herramientas sincrónicas, replicación y helpers CLI
├── tests/ # Suite de pytest (fuera del paquete)
├── docs/ # Guías y tutoriales en Markdown
├── databases/ # Bases de ejemplo usadas en demos/pruebas manuales
├── site/ # Salida estática de la documentación
└── requirements*.txt # Listados de dependencias para instalación rápida
El árbol anterior refleja la jerarquía real: el paquete Python vive en sqliteplus/ y todo el código de producción (por ej.,
sqliteplus/cli.py o sqliteplus/main.py) reside allí. Los directorios tests/, docs/, databases/ y el resto de archivos
de soporte permanecen en la raíz del repositorio, fuera del paquete publicado.
📝 Licencia
MIT License © Adolfo González Hernández
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 sqliteplus_enhanced-1.0.10.tar.gz.
File metadata
- Download URL: sqliteplus_enhanced-1.0.10.tar.gz
- Upload date:
- Size: 68.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82493fcf5c0ae73086762f89af612be3c5b39c4797f9180c5a053b2eb92dafd2
|
|
| MD5 |
d91762d0df7a16e9056fcfb14370cd6d
|
|
| BLAKE2b-256 |
c5957956dc686959c12419e2c8184c5ecf1559387a3474ceee16959a431c6f7c
|
File details
Details for the file sqliteplus_enhanced-1.0.10-py3-none-any.whl.
File metadata
- Download URL: sqliteplus_enhanced-1.0.10-py3-none-any.whl
- Upload date:
- Size: 50.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5eea983c6aa93250cd0226c12f33315977246101b007b4128bc6ed95b0b6c812
|
|
| MD5 |
64056ec4312d01b30517a0d633262e44
|
|
| BLAKE2b-256 |
904df373229fde6d0862a116644f05aa3a5bc363944dd87596c7bd8a26c98ea3
|