PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ajout d'une table d'utilisateurs/comptes à Postgres dans Django View

Mon argent est sur un nom mal orthographié. Je remarque dans le message d'erreur que vous avez

OmniCloud_App_accounts
OmniCloud_App_user

La deuxième table utilise le singulier. Il n'y a pas une deuxième table comme celle-ci par hasard :

OmniCloud_App_users

De plus, l'utilisation d'identificateurs à casse mixte dans PostgreSQL est une excellente source de réputation ici sur SO. Il vous mordra tôt ou tard. Les victimes de cette folie sont des habitués ici. N'importe quelle table avec ce nom peut-être - et vous avez oublié les guillemets doubles dans "OmniCloud_App_user" quelque part ?

omnicloud_app_user

C'est soit ça, soit la transaction qui sauve l'utilisateur n'a pas encore été validée. Pouvez-vous uniquement créer l'utilisateur (et aucun compte pour le moment) et vérifier s'il se retrouve dans la bonne base de données dans le tableau et avec le bon ID ?

Modifier :outils pour diagnostiquer le problème

Si vous savez que les utilisateurs sont créés, alors la question est :est-ce que la contrainte de clé étrangère user_id_refs_id_468fbcec324e93d2 regarde au bon endroit? Même base de données ? Même schéma ? Même tableau ?

Pour savoir quelles tables existent dans votre base de données, essayez la requête suivante (si vous disposez des privilèges nécessaires) :

SELECT n.nspname AS schema_name
      ,c.relname AS table_name
      ,c.relhastriggers
      ,c.reltuples
FROM   pg_catalog.pg_class c
LEFT   JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE  c.relname ~~* '%user%'
AND    c.relkind = 'r'
AND    nspname <> 'pg_catalog';

Affiche toutes les tables de tous les schémas dont le nom contient "user", insensible à la casse. De plus, si la table a des déclencheurs (pourrait cause de votre problème) et le nombre de lignes qu'il contient (estimation mise à jour par ANALYZE ). Peut-être vous donner une piste...

Vous pouvez également utiliser la méta-commande \d du client de ligne de commande standard (terminal interactif) psql .

J'exécuterais un scénario de test et demanderais au serveur postgres de consigner tout ce qu'il obtient. Définissez ce paramètre dans ce but :

set log_statement = 'all';

Le manuel à propos des paramètres de journalisation .

Le manuel sur comment définir les paramètres .