Ich habe die Entwicklung mit einer SQLITE-Datenbank mit Produktion in POSTGRESQL durchgeführt. Ich habe gerade meine lokale Datenbank mit einer großen Datenmenge aktualisiert und muss eine bestimmte Tabelle in die Produktionsdatenbank übertragen.
Basierend auf der Ausführung sqlite database .dump > /the/path/to/sqlite-dumpfile.sql
gibt SQLITE einen Tabellendump im folgenden Format aus:
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;
Wie konvertiere ich das oben Genannte in eine POSTGRESQL-kompatible Dump-Datei, die ich in meinen Produktionsserver importieren kann?
Antworten:
Sie sollten in der Lage sein, diese Dump-Datei direkt in Folgendes einzugeben
psql
:Wenn die
id
Spalte "automatisch inkrementiert" werden soll, ändern Sie ihren Typ in der Tabellenerstellungszeile von "int" in "serial". PostgreSQL fügt dieser Spalte dann eine Sequenz hinzu, sodass INSERTs mit NULL-IDs automatisch der nächste verfügbare Wert zugewiesen wird. PostgreSQL erkennt auch keineAUTOINCREMENT
Befehle, daher müssen diese entfernt werden.Sie sollten auch nach
datetime
Spalten im SQLite-Schema suchen und diese intimestamp
PostgreSQL ändern (danke an Clay für den Hinweis).Wenn Sie Boolesche Werte in Ihrer SQLite haben, können Sie
1
bzw.0
und1::boolean
bzw. konvertieren0::boolean
oder die boolesche Spalte im Schemaabschnitt des Speicherauszugs in eine Ganzzahl ändern und diese nach dem Import manuell in PostgreSQL korrigieren .Wenn Ihre SQLite BLOBs enthält, möchten Sie das zu verwendende Schema anpassen
bytea
. Sie müssen wahrscheinlich auch einigedecode
Anrufe einmischen . Das Schreiben eines schnellen und dreißigfachen Kopierers in Ihrer Lieblingssprache ist möglicherweise einfacher als das Zerlegen von SQL, wenn Sie jedoch mit vielen BLOBs zu tun haben.Wenn Sie Fremdschlüssel haben, sollten Sie wie üblich wahrscheinlich nach
set constraints all deferred
Problemen beim Einfügen von Ordnungen suchen , indem Sie den Befehl in das BEGIN / COMMIT-Paar einfügen.Vielen Dank an Nicolas Riley für die Booleschen, Blob- und Einschränkungsnotizen.
Wenn Sie
`
Code haben, der von einigen SQLite3-Clients generiert wurde, müssen Sie diese entfernen.PostGRESQL erkennt auch keine
unsigned
Spalten. Möglicherweise möchten Sie diese löschen oder eine benutzerdefinierte Einschränkung wie die folgende hinzufügen:Während SQLite standardmäßig Nullwerte verwendet
''
, müssen diese nach PostgreSQL als festgelegt werdenNULL
.Die Syntax in der SQLite-Dump-Datei scheint größtenteils mit PostgreSQL kompatibel zu sein, sodass Sie einige Dinge patchen und füttern können
psql
. Das Importieren eines großen Datenstapels über SQL INSERTs kann eine Weile dauern, funktioniert jedoch.quelle
datetime
Spalten migrieren müssen, diesetimestamp
für Postgres ändern müssen.BLOB
inBYTEA
( stackoverflow.com/questions/3103242 ), Ändern von 0/1 fürBOOLEAN
Spalten in '0' / '1' und Verschieben von Einschränkungen (DEFERRABLE
/SET CONSTRAINTS ALL DEFERRED
).pgloader
Ich bin auf diesen Beitrag gestoßen, als ich nach einer Möglichkeit gesucht habe, einen SQLite-Dump in PostgreSQL zu konvertieren. Obwohl dieser Beitrag eine akzeptierte Antwort hat (und eine gute dazu +1), halte ich das Hinzufügen für wichtig.
Ich begann hier nach Lösungen zu suchen und stellte fest, dass ich nach einer automatisierteren Methode suchte. Ich habe die Wiki-Dokumente nachgeschlagen:
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
und entdeckt
pgloader
. Ziemlich coole Anwendung und relativ einfach zu bedienen. Sie können die flache SQLite-Datei in eine verwendbare PostgreSQL-Datenbank konvertieren. Ich habe von installiert*.deb
und einecommand
Datei wie diese in einem Testverzeichnis erstellt:wie die docs Zustand. Ich habe dann ein
testdb
mit erstelltcreatedb
:createdb testdb
Ich habe den
pgloader
Befehl folgendermaßen ausgeführt:pgloader command
und dann mit der neuen Datenbank verbunden:
psql testdb
Nach einigen Abfragen zur Überprüfung der Daten scheint es ziemlich gut funktioniert zu haben. Ich weiß, wenn ich versucht hätte, eines dieser Skripte auszuführen oder die hier erwähnte schrittweise Konvertierung durchzuführen, hätte ich viel mehr Zeit aufgewendet.
Um das Konzept zu beweisen, habe ich dies gelöscht
testdb
und in eine Entwicklungsumgebung auf einem Produktionsserver importiert und die Daten gut übertragen.quelle
Ich schrieb ein Skript das zu tun ,
sqlite3
um diepostgres
Migration. Es werden nicht alle unter https://stackoverflow.com/a/4581921/1303625 genannten Schema- / Datenübersetzungen verarbeitet , aber es wird das getan, wofür ich es benötigt habe. Hoffentlich ist es ein guter Ausgangspunkt für andere.https://gist.github.com/2253099
quelle
Das Sequel Gem (eine Ruby-Bibliothek) bietet das Kopieren von Daten in verschiedene Datenbanken: http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases
Installieren Sie zuerst Ruby und dann den Edelstein, indem Sie ihn ausführen
gem install sequel
.Im Falle von SQLite wäre es so:
sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
quelle
pgloader
.Sie können einen Einzeiler verwenden. Hier ein Beispiel mit Hilfe des Befehls sed:
quelle
sed -e 's/DATETIME/TIMESTAMP/g'
sed -e 's/TINYINT(1)/SMALLINT/g'
- und für einen Vergleich aller Datentypen siehe stackoverflow.com/questions/1942586/…' | sed -e '
durch;
:)Ich habe versucht, den SQLite-Speicherauszug zu bearbeiten / neu zu drucken, damit PostgreSQL ihn akzeptiert. Er ist langwierig und fehleranfällig.
Was ich sehr schnell arbeiten musste:
Erstellen Sie zuerst das Schema unter PostgreSQL ohne Daten neu, indem Sie entweder den Speicherauszug bearbeiten oder wenn Sie ein ORM verwenden, haben Sie möglicherweise Glück und es spricht mit beiden Back-Ends (sqlalchemy, peewee, ...).
Migrieren Sie dann die Daten mit Pandas. Angenommen, Sie haben eine Tabelle mit einem Bool-Feld (das in SQLite 0/1 ist, in PostgreSQL jedoch t / f sein muss).
Dies funktioniert wie ein Zauber, ist einfach zu schreiben, zu lesen und zu debuggen, im Gegensatz zu (für mich) den regulären Ausdrücken.
Jetzt können Sie versuchen, die resultierende CSV mit PostgreSQL zu laden (auch grafisch mit dem Admin-Tool), mit der einzigen Einschränkung, dass Sie die Tabellen mit Fremdschlüsseln laden müssen, nachdem Sie die Tabellen mit den entsprechenden Quellschlüsseln geladen haben. Ich hatte nicht den Fall einer zirkulären Abhängigkeit, ich denke, Sie können die Schlüsselprüfung vorübergehend aussetzen, wenn dies der Fall ist.
quelle
pgloader wirkt Wunder bei der Konvertierung von Datenbanken in SQLite in Postgresql.
Hier ist ein Beispiel für die Konvertierung eines lokalen sqlitedb in eine entfernte PostgreSQL-Datenbank:
pgloader sqlite.db postgresql: // Benutzername : Passwort @ Hostname / Datenbankname
quelle
KABOOM! Control stack exhausted (no more space for function call frames).