He estado haciendo desarrollo usando la base de datos SQLITE con producción en POSTGRESQL. Acabo de actualizar mi base de datos local con una gran cantidad de datos y necesito transferir una tabla específica a la base de datos de producción.
Según la ejecución sqlite database .dump > /the/path/to/sqlite-dumpfile.sql
, SQLITE genera un volcado de tabla en el siguiente formato:
BEGIN TRANSACTION;
CREATE TABLE "courses_school" ("id" integer PRIMARY KEY, "department_count" integer NOT NULL DEFAULT 0, "the_id" integer UNIQUE, "school_name" varchar(150), "slug" varchar(50));
INSERT INTO "courses_school" VALUES(1,168,213,'TEST Name A',NULL);
INSERT INTO "courses_school" VALUES(2,0,656,'TEST Name B',NULL);
....
COMMIT;
¿Cómo convierto lo anterior en un archivo de volcado compatible con POSTGRESQL que puedo importar a mi servidor de producción?
Respuestas:
Debería poder introducir ese archivo de volcado directamente en
psql
:Si desea que la
id
columna se "incremente automáticamente", cambie su tipo de "int" a "serial" en la línea de creación de la tabla. Posteriormente, PostgreSQL adjuntará una secuencia a esa columna para que a los INSERTs con ID NULL se les asigne automáticamente el siguiente valor disponible. PostgreSQL tampoco reconocerá losAUTOINCREMENT
comandos, por lo que estos deben eliminarse.También querrá buscar
datetime
columnas en el esquema SQLite y cambiarlas atimestamp
PostgreSQL (gracias a Clay por señalar esto).Si tiene valores booleanos en su SQLite, puede convertir
1
y0
y1::boolean
y0::boolean
(respectivamente) o puede cambiar la columna booleana a un número entero en la sección de esquema del volcado y luego arreglarlos a mano dentro de PostgreSQL después de la importación.Si tiene BLOB en su SQLite, entonces querrá ajustar el esquema para usar
bytea
. Probablemente también necesitará mezclar algunasdecode
llamadas . Escribir una copiadora rápida y sucia en su idioma favorito podría ser más fácil que alterar el SQL si tiene muchos BLOB con los que lidiar.Como de costumbre, si tiene claves foráneas, probablemente querrá investigar
set constraints all deferred
para evitar problemas de orden de inserción, colocando el comando dentro del par BEGIN / COMMIT.Gracias a Nicolas Riley por las notas booleanas, blob y de restricciones.
Si tiene
`
en su código, tal como lo generan algunos clientes SQLite3, debe eliminarlos.PostGRESQL tampoco reconoce
unsigned
columnas, es posible que desee eliminar eso o agregar una restricción personalizada como esta:Si bien SQLite establece los valores nulos de forma predeterminada en
''
, PostgreSQL requiere que se establezcan comoNULL
.La sintaxis en el archivo de volcado de SQLite parece ser mayormente compatible con PostgreSQL, por lo que puede parchear algunas cosas y alimentarlas
psql
. Importar una gran cantidad de datos a través de SQL INSERT puede llevar un tiempo, pero funcionará.fuente
datetime
columnas sqlite , debe cambiarlas atimestamp
para postgres.BLOB
aBYTEA
( stackoverflow.com/questions/3103242 ), cambiar 0/1 para lasBOOLEAN
columnas a '0' / '1' y diferir las restricciones (DEFERRABLE
/SET CONSTRAINTS ALL DEFERRED
).pgloader
Encontré esta publicación cuando buscaba una forma de convertir un volcado de SQLite a PostgreSQL. Aunque esta publicación tiene una respuesta aceptada (y una buena en ese +1), creo que agregar esto es importante.
Comencé a buscar soluciones aquí y me di cuenta de que estaba buscando un método más automatizado. Busqué los documentos de la wiki:
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
y descubierto
pgloader
. Una aplicación muy buena y relativamente fácil de usar. Puede convertir el archivo SQLite plano en una base de datos PostgreSQL utilizable. Instalé desde*.deb
y creé uncommand
archivo como este en un directorio de prueba:como el estado de docs . Luego creé un
testdb
concreatedb
:createdb testdb
Ejecuté el
pgloader
comando así:pgloader command
y luego conectado a la nueva base de datos:
psql testdb
Después de algunas consultas para verificar los datos, parece que funcionó bastante bien. Sé que si hubiera intentado ejecutar uno de estos scripts o hacer la conversión paso a paso mencionada aquí, habría pasado mucho más tiempo.
Para probar el concepto, descargué esto
testdb
y lo importé a un entorno de desarrollo en un servidor de producción y los datos se transfirieron muy bien.fuente
Escribí un guión para hacer el
sqlite3
depostgres
la migración. No maneja todas las traducciones de esquemas / datos mencionadas en https://stackoverflow.com/a/4581921/1303625 , pero hace lo que necesitaba que hiciera. Ojalá sea un buen punto de partida para otros.https://gist.github.com/2253099
fuente
La secuela de gemas (una biblioteca Ruby) ofrece copia de datos en diferentes bases de datos: http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases
Primero instale Ruby, luego instale la gema ejecutando
gem install sequel
.En el caso de sqlite, sería así:
sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
fuente
pgloader
.Puede usar un trazador de líneas, aquí hay un ejemplo con la ayuda del comando sed:
fuente
sed -e 's/DATETIME/TIMESTAMP/g'
sed -e 's/TINYINT(1)/SMALLINT/g'
- y para una comparación de todos los tipos de datos, consulte stackoverflow.com/questions/1942586/…' | sed -e '
con;
:)He intentado editar / regexping el volcado de sqlite para que PostgreSQL lo acepte, es tedioso y propenso a errores.
Lo que llegué a trabajar realmente rápido:
Primero vuelva a crear el esquema en PostgreSQL sin ningún dato, ya sea editando el volcado o si estaba usando un ORM, puede tener suerte y se comunica con ambos back-end (sqlalchemy, peewee, ...).
Luego, migre los datos usando pandas. Suponga que tiene una tabla con un campo bool (que es 0/1 en sqlite, pero debe ser t / f en PostgreSQL)
Esto funciona como un encanto, es fácil de escribir, leer y depurar cada función, a diferencia (para mí) de las expresiones regulares.
Ahora puede intentar cargar el csv resultante con PostgreSQL (incluso gráficamente con la herramienta de administración), con la única advertencia de que debe cargar las tablas con claves externas después de haber cargado las tablas con las claves de origen correspondientes. No tuve el caso de una dependencia circular, supongo que puede suspender temporalmente la verificación de claves si ese es el caso.
fuente
pgloader hace maravillas en la conversión de base de datos en sqlite a postgresql.
Aquí hay un ejemplo sobre cómo convertir un sqlitedb local en un db PostgreSQL remoto:
pgloader sqlite.db postgresql: // nombre de usuario : contraseña @ nombre de host / dbname
fuente
KABOOM! Control stack exhausted (no more space for function call frames).