PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hinzufügen einer Benutzer-/Kontentabelle zu Postgres in Django View

Mein Geld ist auf einen falsch geschriebenen Namen. Ich sehe in der Fehlermeldung, dass Sie

OmniCloud_App_accounts
OmniCloud_App_user

Die zweite Tabelle verwendet den Singular. Es gibt nicht zufällig eine zweite Tabelle wie diese:

OmniCloud_App_users

Auch die Verwendung von Bezeichnern für gemischte Groß- und Kleinschreibung in PostgreSQL ist hier auf SO eine großartige Quelle des Ansehens. Es wird dich früher oder später beißen. Opfer dieser Torheit sind Stammgäste hier. Jede Tabelle mit diesem Namen vielleicht - und Sie haben die doppelten Anführungszeichen in "OmniCloud_App_user" vergessen irgendwo?

omnicloud_app_user

Entweder das oder die Transaktion, die den Benutzer speichert, wurde noch nicht festgeschrieben. Können Sie nur den Benutzer (und noch keine Konten) erstellen und prüfen, ob er in der richtigen Datenbank in der Tabelle und mit der richtigen ID landet?

Bearbeiten:Tools zum Diagnostizieren des Problems

Wenn Sie wissen dass Benutzer erstellt werden, dann ist die Frage:funktioniert die Fremdschlüsseleinschränkung user_id_refs_id_468fbcec324e93d2 an der richtigen Stelle suchen? Gleiche Datenbank? Gleiches Schema? Gleiche Tabelle?

Um herauszufinden, welche Tabellen in Ihrer Datenbank vorhanden sind, versuchen Sie die folgende Abfrage (wenn Sie die erforderlichen Berechtigungen haben):

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';

Zeigt alle Tabellen in allen Schemas, die "Benutzer" im Namen haben, Groß- und Kleinschreibung wird nicht beachtet. Plus, wenn die Tabelle Trigger hat (könnte Ursache Ihres Problems) und wie viele Zeilen darin enthalten sind (Schätzung aktualisiert durch ANALYZE ). Könnte Ihnen einen Hinweis geben ...

Sie können auch den Metabefehl \d verwenden des Standard-Befehlszeilenclients (interaktives Terminal) psql .

Ich würde einen Testfall ausführen und den Postgres-Server alles protokollieren lassen, was er erhält. Setzen Sie dazu diesen Parameter:

set log_statement = 'all';

Das Handbuch über Logging-Parameter .

Das Handbuch zum wie man Parameter einstellt .