Django: Quelles sont les meilleures pratiques pour migrer un projet de sqlite à PostgreSQL?
J'ai besoin de migrer un projet complexe de sqlite à PostgreSQL.
Beaucoup de gens semble avoir un problème avec les clés étrangères, les données truncature et ainsi de suite...
- Est-il complet automatisé utilitaire ?
- Faire j'ai besoin de vérifier certaines données ou de schéma avant la migration ?
Modifier : j'ai essayé django-commande-extensions DumpScript mais il ne fonctionne pas sur mon
2 go de RAM PC avec mon DataSet.
source d'informationauteur Pierre-Jean Coudert
Vous devez vous connecter pour publier un commentaire.
Dans mon expérience, le dumping & la restauration à partir de SQL ne fonctionne pas correctement.
Vous devriez suivre cette séquence plutôt:
1. Dump de la db contenu json
2. Basculer dans le backend settings.py
3. Syncdb et de migrer la nouvelle bd de la même structure de table
4. Charger le json à la nouvelle db.
5. Bravo! Maintenant, les nouvelles données dans votre postgres db.
Ce qui suit est un raffinement de Nimo réponse et Stephen réponse pour Django 1.7+:
./manage.py dumpdata --natural-primary --natural-foreign > dump.json
DATABASES
danssettings.py
pour pointer vers le nouveau (PostgreSQL) db../manage.py migrate
./manage.py loaddata dump.json
Un problème que j'ai rencontré est que SQLite ne semble pas respecter la longueur maximale pour
CharField
s. Dans mon cas, ce qui fait que laloaddata
étape échouer. J'ai pu trouver (et supprimer) les instances de modèle avec trop longueCharField
valeurs via:Une fois que je l'ai fait avant l'étape 1. ci-dessus, tout a fonctionné.
Je n'ai jamais eu à le faire, mais ce que je voudrais essayer.
Tout d'abord je voudrais simplement essayer un simple:
À ce point, il suffit de tester. Écrire des scripts de test dans Django à la sortie d'un jeu d'exemples de dossiers pour chaque application, et ensuite faire un diff pour s'assurer qu'ils sont identiques. Si elles le sont, alors votre conversion est probablement pas un problème.
Si cela ne fonctionne pas...
Je le recommande contre l'utilisation de Django pour vider et charger les données, puisque je suppose que c'est pas optimisé pour le faire.
Au lieu de cela, je voudrais créer une deuxième version de votre application avec la bonne base de données PostgreSQL paramètres, exécutez syncdb pour créer toutes les tables, puis copier les données de mysqllite de PostgreSQL à l'aide d'un outil.
La chose est, la plupart des problèmes lors de la conversion des données est dans les définitions de table, etc. Ceux qui semblent être les plus idiosyncrasiques. Si vous pouvez générer un script SQL qui est un dump de la juste le contenu de la table, qui doit être assez standard SQL
INSERT INTO
commandes.Honnêtement, je ne vois pas pourquoi il y aurait de clé étrangère problèmes. En supposant que sqlite est de produire des clés étrangères (et pourquoi ne serait-il pas?) ensuite, il n'y a aucun moyen de ne pas copier correctement. Vraiment, les clés étrangères ne sont pas des formes particulières de données. Ce n'est pas plus probable que le
UserProfile.user_id
champ contient une valeur incorrecte de laUserProfile.photo
champ. Si la clé étrangère est à craindre que les champs eux-mêmes ne sont pas correctement identifiés comme des champs de clé étrangère (pas de contraintes), puis la possibilité de créer d'abord la base de données à l'aide desyncdb
va remédier à ce problème.Comme par troncature: comme je le comprends, PostgreSQL jette une grosse erreur si les données sont sur le point d'être tronquée. Je ne sais pas si c'est le cas avec sqlite ou si il tronque simplement en silence. De toute façon, encore une fois en supposant que sqlite n'est-ce pas en quelque sorte munging les données sur l'exportation, les champs doivent contenir des données qui sont de la longueur appropriée pour le terrain, il va dans. La seule chose que je peux penser qui pourrait affecter c'est l'encodage des caractères, donc assurez-vous que le PostgreSQL champs ont le même encodage que l'sqlite tables de faire, au moins au cours de l'importation.
Une autre manière de faire peut être d'utiliser plusieurs bases de données.
http://docs.djangoproject.com/en/dev/topics/db/multi-db/
Il est important de lire cette section.
http://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another
De ce que je comprends, cela signifie qu'il n'y a pas de données dans votre nouvelle bd, des appareils sanitaires, par exemple, vous pourriez faire
Parce que cela devrait préserver les clés primaires, je ne pense pas qu'il y aurait une clé étrangère questions.
Selon l' @Nimo réponse, utilisé à partir de
"syncdb"
"syncdb"
ne fonctionne pas dans Django 1.9 (fonctionne sur django 1.7)au lieu de cela, utilisez la commande suivante:
python manage.py migrate
Et postgres paramètre de configuration est ici:
Ce qui a fonctionné pour moi était de courir à la suite de ruby.
Il suffit d'exécuter la commande:
Vous aurez besoin d'avoir installé sur votre système, les paquets de développement pour postgres , sqlite et ruby
Exécutez la commande:
Créer une base de données vide sur postgresql, disons testDB et d'attribuer une subvention de l'autorisation à un utilisateur
À partir de l'invite de commande, exécutez:
Ce sera exécuté sans erreur.
Modifier les paramètres de votre projet django de travailler avec la base de données postgres
Exécuter
./manage migrate (not necessary)
Exécuter le serveur