- Una extensión que permite incrustar la propia base de datos SQLite en tablas de PostgreSQL mediante el tipo de columna SQLITE
- Con este enfoque se resuelve la multitenencia
- Crear una base de datos vacía con
empty_sqlite: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
- Se puede consultar con la función
query_sqlite, e insertar/actualizar con execute_sqlite
SELECT * FROM query_sqlite(database, 'SELECT * FROM todos');
UPDATE people SET database = execute_sqlite(database, 'INSERT INTO todos VALUES (''solve multitenancy'')') WHERE name = 'frectonz';
- Leer una columna específica con las funciones
get_sqlite_text/get_sqlite_integer/get_sqlite_real: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
- Escrito con Rust + el framework Pgrx
- Detalles de implementación:
- La base de datos se guarda como un
Vec<u8> codificado en CBOR (Concise Binary Object Representation)
- Al ejecutar una consulta, se crea como un archivo aleatorio en la carpeta /tmp. SQLite carga el archivo, ejecuta la consulta y devuelve el resultado como una tabla de una sola fila con valores codificados en JSON
5 comentarios
WOW..
Dios mío...
pgrx - Un framework para desarrollar extensiones de PostgreSQL con Rust
Es una extensión algo rara, pero me hace pensar que quizá podría servir en casos como cuando estás creando un SaaS escalable y el usuario necesita incrustar funciones básicas de base de datos de forma sencilla.
Comentarios de Hacker News
La mayoría de los sistemas de gestión de bases de datos relacionales no admiten registros anidados, y SQL también carece de capacidades para crear o aprovechar tablas anidadas
Se propone la idea de empaquetar el directorio de la base de datos de PostgreSQL en un
tary codificarlo como un blob binario en SQLiteSe cuestionan los casos de uso de esta idea
Hay quien opina que una columna de SQLite sería mejor que una columna JSON de SQLite
El mecanismo de archivos en
/tmpparece un hack, y se cuestiona si realmente es necesarioVACUUM INTOpara cargar los datos del blob binarioSi ya se usa PostgreSQL, el problema de multi-tenancy puede resolverse con Row Level Security (RLS)
¿Un crimen contra 1NF (primera forma normal)?
Hay quejas por la falta de operadores
DATABASEcon otras