Convertir SQLITE, SQL fichier de vidage de POSTGRESQL
J'ai été faire du développement à l'aide de la base de données SQLITE avec la production dans POSTGRESQL. Je viens de mettre à jour ma base de données locale avec une énorme quantité de données et la nécessité de transférer une table spécifique à la base de données de production.
Basée sur l'exécution de sqlite database .dump > /the/path/to/sqlite-dumpfile.sql
, SQLITE sorties d'un tableau de vidage dans le format suivant:
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;
Comment puis-je convertir ci-dessus dans un POSTGRESQL compatible fichier dump que je peux importer dans mon serveur de production?
- Et bien, cette commande n'a pas fonctionné pour moi jusqu'à ce que j'ai changé de sqlite pour sqlite3
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure à alimenter le fichier de vidage directement dans
psql
:Si vous voulez le
id
colonne "auto increment" puis changer son type de "int" à "série" dans la création de la table ligne. PostgreSQL fixera ensuite une séquence à la colonne afin que les Insertions avec NULL id sera attribué automatiquement la valeur suivante disponible. PostgreSQL ne sera également pas reconnaîtreAUTOINCREMENT
de commandes, pour ces le besoin d'être enlevé.Vous aurez également besoin de vérifier pour
datetime
colonnes dans l'SQLite schéma et de le modifier àtimestamp
pour PostgreSQL (grâce à L'argile pour le signaler).Si vous avez des booléens dans votre SQLite, vous pouvez convertir
1
et0
et1::boolean
et0::boolean
(respectivement) ou vous pouvez changer la colonne booléenne à un nombre entier dans le schéma de la section de la décharge et ensuite les corriger à la main à l'intérieur de PostgreSQL après l'importation.Si vous avez des Gouttes dans votre SQLite, alors vous aurez envie de régler le schéma à utiliser
bytea
. Vous aurez probablement besoin de mélanger dans certainsdécoder
appels ainsi. La rédaction d'un rapide n'dirty copieur dans votre langue préférée peut être plus facile que d'amputation SQL si vous avez beaucoup de Gouttes de traiter avec si.Comme d'habitude, si vous avez des clés étrangères, alors vous aurez probablement envie de regarder dans
définir les contraintes de toutes les
pour éviter d'insérer la commande de problèmes, la passation de la commande à l'intérieur de l'BEGIN/COMMIT paire.Grâce à Nicolas Riley pour les booléens, blob, et les contraintes de notes.
Si vous avez
`
sur votre code, généré par certains SQLite3 clients, vous devez les supprimer.PostGRESQL aussi ne pas reconnaître
unsigned
colonnes, vous pouvez déposer, ou ajouter une mesure de contrainte comme ceci:Alors que SQLite par défaut les valeurs null pour
''
, PostgreSQL oblige à être défini commeNULL
.La syntaxe dans l'SQLite fichier de vidage semble être la plupart du temps compatible avec PostgreSQL, donc vous pouvez appliquer un peu de choses et le nourrir à
psql
. L'importation d'un gros tas de données via SQL insert peut prendre un certain temps, mais ça va marcher.psql
commutateurs.datetime
colonnes, que vous avez à les modifier àtimestamp
pour postgres.BLOB
enBYTEA
(stackoverflow.com/questions/3103242), la modification de 0/1 pourBOOLEAN
les colonnes de '0'/'1', et à reporter les contraintes (DEFERRABLE
/SET CONSTRAINTS ALL DEFERRED
).unsigned
devrait être abandonnée.integer
type de Sqlite par défaut est de 8 octets, alors que lainteger
type PostgreSQL est de 4 octets. Pour être sûr, vous pouvez convertir vosinteger
tapé colonnes dans Sqlite, à labigint
type PostgreSQL.timestamptz
comme type de colonne. Pour plus de détails, voir postgresql.org/docs/9.2/static/datatype-datetime.htmlERROR: relation "sqlite_sequence" does not exist
àDELETE FROM sqlite_sequence;
comment résoudre ce problème?DELETE FROM sqlite_sequence;
et remplacerINSERT INTO "sqlite_sequence" VALUES('locations',7);
avecALTER SEQUENCE locations_id_seq RESTART WITH 8;
et ça marche...!psql
de travail". Dans le cas général, ce n'est pas vrai, alors j'ai donné la réponse comme un wiki de la communauté (c'est à dire je ne reçois rien pour cela et il est facile pour l'ensemble de la communauté pour mettre à jour et de maintenir et de se plaindre et de quoi que ce soit).pgloader
Je suis tombé sur ce post lors de la recherche d'un moyen de convertir un dump SQLite pour PostgreSQL. Même si ce post a accepté de répondre (et un bon à +1), je pense que l'ajout de ce qui est important.
J'ai commencé à regarder dans les solutions ici et réalisé que je cherchais une méthode automatique. J'ai regardé le wiki docs:
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
et découvert
pgloader
. Assez cool d'application et il est relativement facile à utiliser. Vous pouvez convertir le plat SQLite fichier utilisable à une base de données PostgreSQL. J'ai installé le*.deb
et créé uncommand
fichier comme ceci dans un répertoire de test:comme le docs état. Ensuite, j'ai créé un
testdb
aveccreatedb
:createdb testdb
J'ai couru le
pgloader
de commande comme ceci:pgloader command
puis connecté à la nouvelle base de données:
psql testdb
Après quelques requêtes pour vérifier les données, il apparaît qu'il a très bien. Je sais que si j'avais essayé d'exécuter l'un de ces scripts ou de faire la conversion progressive mentionnés dans ce document, j'aurais passé beaucoup plus de temps.
Pour prouver le concept j'ai perdu cette
testdb
et importés dans un environnement de développement sur un serveur de production et les données transférées sur bien.J'ai écrit un script pour faire le
sqlite3
àpostgres
de la migration. Il ne gère pas tous le schéma/données traductions mentionnées dans https://stackoverflow.com/a/4581921/1303625, mais ça fait ce que je devais faire. J'espère que ce sera un bon point de départ pour d'autres.https://gist.github.com/2253099
La suite gem (Ruby library) offre de copie de données entre différentes bases de données:
http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Bases de données
En cas de sqlite, ce serait comme ça:
sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
Vous pouvez utiliser une seule ligne, voici un exemple avec l'aide de la commande sed:
sed -e 's/DATETIME/TIMESTAMP/g'
sed -e 's/TINYINT(1)/SMALLINT/g'
-- et pour une comparaison de tous les types de données, voir stackoverflow.com/questions/1942586/...ERROR: syntax error at or near "AUTOINCREMENT"
J'ai essayé d'édition/regexping l'sqlite dump pour PostgreSQL accepte, il est fastidieuse et sujette à l'erreur.
Ce que j'ai eu à travailler très vite:
Première recréer le schéma sur PostgreSQL, sans données, soit à l'édition de la décharge ou si vous utilisez un ORM vous pouvez être chanceux et il parle à la fois aux extrémités (sqlalchemy, peewee, ...).
Puis migrer les données à l'aide de pandas. Supposons que vous avez une table avec un bool champ (qui est 0/1 dans sqlite, mais doit être t/f dans PostgreSQL)
Cela fonctionne comme un charme, est facile à lire, écrire et déboguer chaque fonction, à la différence (pour moi) les expressions régulières.
Maintenant, vous pouvez essayer de charger le résultant csv avec PostgreSQL (même graphiquement avec l'outil d'administration), avec la seule réserve que vous devez charger les tables avec des clés étrangères après avoir chargé les tableaux avec les touches de source. Je n'ai pas eu le cas d'une dépendance circulaire, je suppose que vous pouvez suspendre temporairement la clé de vérifier si c'est le cas.
pgloader faire des merveilles sur la conversion de la base de données sqlite pour postgresql.
Voici un exemple sur la conversion d'un local sqlitedb à une distance de PostgreSQL db:
pgloader sqlite.db postgresql://nom d'utilisateur:mot de passe@nom d'hôte/dbname
KABOOM! Control stack exhausted (no more space for function call frames).