To zní hodně jako problém s transakcí, kde nejste COMMIT
po práci, takže změny budou ztraceny. Pokud je výchozí nastavení vašeho ovladače SQLite COMMIT
ting transakcí, které jsou uzavřeny bez explicitního COMMIT
nebo rollback a váš ovladač Pg se automaticky nastaví na ROLLBACK
, dostanete popsané chování. Totéž se stane, pokud SQLite ve výchozím nastavení automaticky zadává každý příkaz a ovladač ovladače Pg jako výchozí otevírá transakci.
Toto je jeden z mnoha dobrých důvodů, proč používat stejnou místní databázi pro testování, do jaké se chystáte nasadit, když chcete spustit.
Pokud byste byli na normální instanci Pg, řekl bych vám, abyste povolili log_statement = 'all'
v postgresql.conf
, znovu načtěte Pg a sledujte protokoly. Na Heroku to udělat nemůžete, ale máte přístup k Pg logům pomocí heroku logs --ps postgres
. Zkuste spustit ALTER USER my_heroku_user SET log_statement = 'all';
, opětovné testování a zkoumání protokolů.
Případně nainstalujte Pg lokálně.
Další méně pravděpodobné možnosti, které vás napadnou:
- Pro čtení používáte dlouhodobé transakce SERIALIZABLE, takže jejich snímek se nikdy neaktualizuje. Docela nepravděpodobné.
- Oprávnění k databázovým objektům způsobují
INSERT
s,UPDATE
s atd. selžou a vaše aplikace výsledné chyby ignoruje. Opět nepravděpodobné. - Máte možnost
DO INSTEAD
pravidla, která nedělají to, co očekáváte, neboBEFORE
spouštěče, které vracejíNULL
, čímž se operace tiše změní na neoperace. Zdá se to nepravděpodobné, pokud testujete s SQLite. - Píšete do jiné DB, než ze které čtete. Není to nemožné v nastaveních, která se pokoušejí číst ze skupiny aktivních pohotovostních režimů atd.