J'ai une application Django 1.4 avec une base de données postgres 9.1 remplie localement sur le serveur de développement. Après un déploiement réussi, je voulais déplacer les données de la base de données locale vers la base de données en ligne, j'ai donc utilisé:
pg_dump -f dump.sql -Ox database
puis restauré sur le serveur avec:
psql -1 -f dump.sql database
Maintenant, essayer de se connecter en ligne à l'administrateur du site Web génère une exception "autorisation refusée pour la relation Django_session". J'ai essayé de vider les données avec/sans commutateur -Ox et toutes ses combinaisons mais sans succès. Je supprime également la base de données et la recrée à partir de zéro sur le serveur avec le bon propriétaire comme défini dans settings.py.
Si je lance un syndb normal sans restauration, tout fonctionne bien.
Est-ce que j'ai râté quelque chose?
Il s'avère que vous devez accorder la propriété explicite de tous les objets de la base de données au propriétaire après la restauration. Le propriétaire n'est pas un superutilisateur. Il ne suffit pas de définir uniquement le propriétaire au moment de la création de la base de données. La solution finale pour la migration se présente comme suit:
sur le client:
pg_dump -f dump.sql -Ox database
sur le serveur:
su postgres
dropdb database
createdb database -O user
psql database -f dump.sql
puis pour définir les privilèges:
psql database -c "GRANT ALL ON ALL TABLES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to user;"
Notez que nous aurions pu exécuter la commande sql dans la console psql mais ce formulaire est facilement intégrable dans les scripts et autres.
Essayez de le faire depuis postgres
utilisateur:
Sudo su - postgres
pg_dump -f dump.sql -Ox database
Ou passez simplement -U
drapeau:
pg_dump -f dump.sql -Ox database -U postgres