Moje peníze jsou na špatně napsané jméno. V chybové zprávě jsem si všiml, že máte
OmniCloud_App_accounts
OmniCloud_App_user
Druhá tabulka používá jednotné číslo. Druhý stůl zde není náhodou:
OmniCloud_App_users
Také použití smíšených identifikátorů případu v PostgreSQL je skvělým zdrojem reputace zde na SO. Dříve nebo později vás to kousne. Oběti této pošetilosti jsou zde pravidelné. Možná jakákoli tabulka s tímto názvem – a zapomněli jste na dvojité uvozovky v "OmniCloud_App_user"
někde?
omnicloud_app_user
Buď je to tím, nebo transakce zachraňující uživatele ještě nebyla potvrzena. Můžete pouze vytvořit uživatele (a zatím žádné účty) a zkontrolovat, zda skončí ve správné databázi v tabulce a se správným ID?
Upravit:nástroje pro diagnostiku problému
Pokud víte že uživatelé jsou vytvářeni, pak otázka zní:má omezení cizího klíče user_id_refs_id_468fbcec324e93d2
podívat se na správné místo? Stejná databáze? Stejné schéma? Stejný stůl?
Chcete-li zjistit, které tabulky ve vaší databázi existují, zkuste následující dotaz (pokud máte potřebná oprávnění):
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';
Zobrazuje všechny tabulky ve všech schématech, které mají v názvu "user", bez ohledu na velikost písmen. Navíc, pokud tabulka obsahuje spouštěče (mohlo způsobit váš problém) a kolik řádků je v něm (odhad aktualizován ANALYZE
). Mohl by vám dát vodítko ...
Můžete také použít meta-příkaz \d
standardního klienta příkazového řádku (interaktivní terminál) psql
.
Spustil bych testovací případ a nechal postgres server zaprotokolovat vše, co dostane. Pro tento účel nastavte tento parametr:
set log_statement = 'all';
Příručka o parametrech protokolování .
Manuál jak nastavit parametry .