web-dev-qa-db-fra.com

Procédure pour résoudre "Django.db.utils.ProgrammingError: autorisation refusée pour la relation Django_migrations"

Quelles sont les étapes de base pour le dépannage et la résolution de la cause de l'erreur "Django.db.utils.ProgrammingError: permission refusée pour la relation Django_migrations" de Django?

Je reçois ce message après ce qui était à l’origine un serveur de production stable, mais qui a depuis apporté des modifications à plusieurs aspects de Django, Postgres, Apache et un tirage de Github. En outre, cela fait un certain temps que ces modifications ont été apportées et je ne me souviens pas ou ne peux pas suivre chaque modification pouvant être à l'origine du problème.

Je reçois le message lorsque j'exécute python manage.py runserver ou toute autre commande python manage.py ... à l'exception de python manage.py check, qui indique que le système fonctionne correctement.

17
user3062149

J'ai pu résoudre mon problème en suivant les instructions de cette question . En gros, les privilèges postgres devaient être redistribués à l’utilisateur de la base de données. Dans mon cas, c’était l’utilisateur que j’avais configuré dans le fichier de paramètres de l’environnement virtuel. Exécutez les commandes suivantes depuis la ligne de commande (ou dans postgres) où mydatabase et dbuser devraient être votre propre base de données et vos noms d’utilisateur: 

psql mydatabase -c "GRANT ALL ON ALL TABLES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to dbuser;"
60
user3062149

Comme mentionné par @ user3062149, cela est probablement dû à la tentative de migration d'une table de base de données pour laquelle l'utilisateur psycopg2 de Django n'est pas le propriétaire de la table. Par exemple, si vous avez dans le settings.py de votre projet

DATABASES = {
    'default': {
        'USER': 'my_username',
        # ...

Vous devrez vérifier que la table impliquée dans la migration de Django appartient à my_username. Pour ce faire, dans psql, vous pouvez utiliser SELECT * FROM pg_tables ORDER BY tableowner;. Ceci utilise la vue pg_tables , qui "donne accès à des informations utiles sur chaque table de la base de données". pg_tables fait partie des catalogues système de Postgres , l'endroit où un système de gestion de base de données relationnelle stocke des métadonnées de schéma.

Supposons que la table en question appartient à other_username (et non à my_username).

Pour mettre à jour le propriétaire, vous devez ensuite appeler psql avec --username=other_username, puis changer le propriétaire:

ALTER TABLE public.<table_name> OWNER TO my_username;
1
Brad Solomon