Résolue

Postgresql 15 vs schema public

# Configuration # Bases de données # Django

PostgreSQL 15 supprime la permission ‘CREATE’ sur le schéma public (ou le schéma par défaut) pour tous les utilisateurs, sauf le propriétaire de la base de données.

il faut donc creer un schema dédié:

CREATE SCHEMA blog AUTHORIZATION blogadmin;

et modifier le setting.py pour l'utiliser

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'blog',
        'USER': 'blogadmin',
        'PASSWORD': 'xxx',
        'HOST': 'localhost',
        'OPTIONS': {
                'options': '-c search_path=blog'
        },
    }
}

sinon vous allez avoir l'erreur:

LINE 1: CREATE TABLE "django_migrations" ("id" bigint NOT NULL PRIMA...

Thibault houdon

Mentor

Salut Nicolas, bon à savoir merci, j'ai fait le switch à postgres 15 sur Docstring mais la BDD existait déjà du coup je n'avais pas eu le souci.

Je vais rajouter des notes sur les formations qui parlent de création de BDD.

Merci beaucoup d'avoir signalé ce changement et bonne continuation !

bonsoir, pour une raison que bien sûr j'ignore la méthode de Nicolas ne fonctionne pas chez moi pour l'erreur suivante:

Unable to create the django_migrations table (permission denied for schema public LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...

mais voici ce qui a fonctionné:

- me placer dans `psql -p5432 "blog"` puis entrer successivement `GRANT ALL ON SCHEMA public to public;` et `GRANT ALL ON SCHEMA public TO blogadmin;` sans rien jouter de plus dans SETTINGS. Je suis sous Postgres 15 également mais cela avait aussi fonctionné sous 16.

Par contre la table posts_blogpost n'apparait pas quand je fais \dt...

Je précise que j'ai trouvé cette info sur les forums.... Est-ce possible d'avoir une explication de ces commandes?
Bonne soirée.

Àli

Thibault houdon

Mentor

Salut Àli !

Il s'agit de problèmes de permissions, ça peut arriver en fonction des différentes versions de Postgres utilisées, comme dans le post original, ou à cause d'autres manipulations sur la base.

Les commandes que tu as utilisées servent à donner des droits sur le schéma public, c'est le schéma par défaut :

  1. GRANT ALL ON SCHEMA public TO public; donne toutes les permissions sur le schéma public à tous les utilisateurs.

  2. GRANT ALL ON SCHEMA public TO blogadmin; c'est pareil mais avec l'utilisateur blogadmin.

Donc, avec ces commandes, tu donnes essentiellement les permissions d'avant PostgreSQL 15, où par défaut tous les utilisateurs pouvaient créer des tables dans le schéma public (et tu t'assures de les donner aussi à blogadmin).

Pour le fait que tu ne vois pas la table posts_blogpost, c'est parce que par défaut le terminal n'affiche pas tout, tu peux continuer l'affichage en appuyant sur la barre d'espace :)

Salut Thibault, merci pour ton retour. est-ce qu'il y a une démarche à suivre qui fonctionne dans tous les cas de figure car celle de Nicolas n'a pas fonctionné pour moi? Je n'ai rien vu à ce sujet dans la formation django, partie Postgres.
bonne soirée

Thibault houdon

Mentor

Hello !

Dans le cas de la manipulation de Nicolas, il a créé un nouveau schéma, après il faut bien penser à l'indiquer comme il l'a fait dans le fichier settings.py.

Dans le message d'erreur que tu as mis :

Unable to create the django_migrations table (permission denied for schema public LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...

Il semble encore utiliser le schéma public.

Après sur le fond les deux solutions sont similaires. Nicolas crée un nouveau schéma en donnant les autorisations à l'utilisateur blogadmin et dans ton cas donner les autorisations à l'utilisateur blogadmin mais directement sur le schéma public.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.