comment sauvegarder un django db

J'ai une application Django qui utilise une base de données Postgres. Je dois pouvoir sauvegarder et restaurer la base de données, à la fois pour m'assurer qu'aucune donnée n'est perdue et pour pouvoir copier des données du serveur de production vers le serveur de développement pendant les tests.

Il semble y avoir quelques façons de faire cela:

  1. juste interagir directement avec le db. Donc, pour Postgres je pourrais écrire un script en utilisant pg_dumpall et psql.

  2. utilisez le sqlclear/sqlall commandes qui viennent avec Django.

  3. dumpdata/loaddata commandes qui viennent avec Django. Alors créez de nouveaux fixtures à partir de la base de données que vous voulez sauvegarder, puis chargez-les dans la base de données que vous voulez restaurer.

  4. utilisez un plugin Django comme django-dbbackup.

je ne comprends vraiment pas les avantages/inconvénients de ces différentes techniques.

juste au-dessus de ma tête: L'Option 1 est spécifique à la base de données et l'option 3 semble plus adaptée à la mise en place des données initiales. Mais je ne sais toujours pas quels sont les avantages de l'option 4 par rapport à l'option 2.

31
demandé sur dsprenkels 2014-01-10 20:22:49

2 réponses

pour les sauvegardes régulières, j'opterais pour l'option 1, en utilisant L'outil natif de PostgreSQL, car c'est probablement le plus efficace.

je dirais que l'option 2 est principalement concernée par la création des tables et le chargement des données initiales donc ne convient pas pour les sauvegardes.

L'Option 3 peut être utilisée pour les sauvegardes et serait particulièrement utile si vous aviez besoin de migrer vers une plate-forme de base de données différente puisque les données sont stockées sous une forme non-SQL, i.e. JSON compris par Django.

Option 4 le plugin semble utiliser les propres outils de sauvegarde de db (selon l'option 1) mais fournit en plus de l'aide pour pousser vos sauvegardes dans le stockage en nuage dans Amazon S3 ou Dropbox

18
répondu Anentropic 2014-01-10 21:18:54

le problème avec les options 1-3 est que les fichiers multimédia (tout ce qui est téléchargé par FileField)non inclus dans la sauvegarde. Il est possible de sauvegarder séparément le répertoire contenant les fichiers média. Cependant, parce que Django ne supprime pas les fichiers quand ils ne sont plus référencés par un FileField, vous allez inévitablement finir avec les fichiers de la sauvegarde qui n'ont pas besoin d'être là.

C'est pourquoi je voudrais aller avec l'option #4. En particulier, je recommander django-archive*. Certaines de ses caractéristiques comprennent:

  • vide le contenu de tous les modèles importants (par défaut ContentType,Permission et Session sont exclus puisqu'ils sont peuplés par manage.py migrate) et vous permet de choisir des modèles supplémentaires à exclure.

  • inclut les fichiers multimédia référencés par FileField et ImageField champs. Notez que les fichiers référencés par lignes dans la base de données sont inclus; les fichiers restants par des lignes supprimées sont ignorés.

  • produit une seule archive contenant à la fois la sauvegarde de la base de données et les fichiers multimédia.

  • fournit des options pour personnaliser l'emplacement où les archives devraient être stockées, le format de nom de fichier, et le type d'archive (gz et bz2).

L'Installation est aussi simple que d'ajouter django_archiveINSTALLED_APPS et paramétrage des options dans settings.py si nécessaire. Lorsque installé, vous pouvez immédiatement créer une archive de l'ensemble de votre base de données (y compris les fichiers multimédia) en exécutant:

./manage.py archive

* Avertissement: je suis l'auteur de l'emballage

21
répondu Nathan Osman 2016-03-16 03:09:43