web-dev-qa-db-fra.com

comment sauvegarder un Django db

J'ai une application Django qui utilise une base de données Postgres. J'ai besoin de 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 depuis le serveur de production au serveur de développement pendant les tests.

Il semble y avoir plusieurs façons de procéder:

  1. Il suffit d'interagir directement avec la base de données. Donc, pour Postgres, je pourrais écrire un script en utilisant pg_dumpall et psql.

  2. Utilisez les commandes sqlclear/sqlall fournies avec Django.

  3. Utilisez les commandes dumpdata/loaddata fournies avec Django. Créez donc de nouveaux appareils à partir de la base de données que vous souhaitez sauvegarder, puis chargez-les dans la base de données que vous souhaitez 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 configuration des données initiales. Mais je ne sais toujours pas quels avantages l'option 4 présente par rapport à l'option 2.

41
trubliphone

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

Je dirais que l'option 2 concerne principalement la création des tables et le chargement des données initiales et ne convient donc pas aux sauvegardes.

L'option 3 peut être utilisée pour les sauvegardes et serait particulièrement utile si vous aviez besoin de migrer vers une autre plate-forme de base de données car les données sont vidées sous une forme non SQL, c'est-à-dire JSON compris par Django.

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

22
Anentropic

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

C'est pourquoi j'irais avec l'option # 4. En particulier, je recommande Django-archive*. Certaines de ses fonctionnalités incluent:

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

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

  • Produit une archive unique contenant à la fois la sauvegarde de la base de données et les fichiers multimédias.

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

L'installation est aussi simple que d'ajouter Django_archive à INSTALLED_APPS et paramétrer les options dans settings.py si besoin. Une fois installé, vous pouvez immédiatement créer une archive de l'ensemble de votre base de données (y compris les fichiers multimédias) en exécutant:

./manage.py archive

* Avertissement: Je suis l'auteur du paquet

24
Nathan Osman