140 votes

Convertir le fichier de vidage SQL SQLITE en POSTGRESQL

J'ai fait du développement en utilisant la base de données SQLITE avec la production en POSTGRESQL. Je viens de mettre à jour ma base de données locale avec une énorme quantité de données et j'ai besoin de transférer une table spécifique vers la base de données de production.

Sur la base de l'exécution sqlite database .dump > /the/path/to/sqlite-dumpfile.sql SQLITE produit un vidage de table 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 ce qui précède en un fichier de vidage compatible POSTGRESQL que je peux importer dans mon serveur de production ?

5 votes

Cette commande n'a pas fonctionné pour moi jusqu'à ce que je modifie sqlite a sqlite3

6voto

Kusal Thiwanka Points 101

Essayez ces étapes...

Étape 01 : Dump sqlite db to json

python3 manage.py dumpdata > data.json

Étape 02 : Créer des tables sans migration

python3 manage.py migrate --run-syncdb

Étape 03 : Ouvrez le shell de django. Puis excluez les données de Contentype

python3 manage.py shell
from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
quit()

Étape 04 : Charger les données

python3 manage.py loaddata data.json

2voto

kouichi Points 66

Pgloader fait des merveilles pour convertir une base de données sqlite en postgresql.

Voici un exemple de conversion d'un sqlitedb local en un db PostgreSQL distant :

pgloader sqlite.db postgresql:// nom d'utilisateur : mot de passe @ nom d'hôte / nom de domaine

1voto

agomcas Points 625

J'ai essayé d'éditer/rexpliquer le dump sqlite pour que PostgreSQL l'accepte, c'est fastidieux et sujet aux erreurs.

Ce qui m'a permis de travailler très vite :

Tout d'abord, recréez le schéma sur PostgreSQL sans aucune donnée, soit en éditant le dump, soit si vous utilisez un ORM, vous avez peut-être de la chance et il communique avec les deux back-ends (sqlalchemy, peewee, ...).

Puis migrer les données en utilisant pandas. Supposons que vous ayez une table avec un champ bool (qui est 0/1 en sqlite, mais doit être t/f en PostgreSQL)

def int_to_strbool(df, column):
    df = df.replace({column: 0}, 'f')
    df = df.replace({column: 1}, 't')
    return df

#def other_transform(df, column):
#...

conn = sqlite3.connect(db)
df = pd.read_sql(f'select * from {table_name}', conn)

df = int_to_strbool(df, bool_column_name)
#df = other_transform(df, other_column_name)

df.to_csv(table_name + '.csv'), sep=',', header=False, index=False)

Cela fonctionne comme un charme, il est facile d'écrire, de lire et de déboguer chaque fonction, contrairement (pour moi) aux expressions régulières.

Maintenant vous pouvez essayer de charger le csv résultant avec PostgreSQL (même graphiquement avec l'outil d'administration), avec la seule réserve que vous devez charger les tables avec les clés étrangères après avoir chargé les tables avec les clés sources correspondantes. Je n'ai pas eu le cas d'une dépendance circulaire, je suppose que vous pouvez suspendre temporairement la vérification des clés si c'est le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X