为何用psql与SQLAlchemy连接PostgreSQL时表数据不一致?
以下是几种常见的导致两者查询结果差异的原因:
事务隔离与未提交状态
PostgreSQL默认开启事务,psql连接后如果没有显式执行COMMIT或ROLLBACK,会一直处于当前事务的快照中,无法看到其他连接提交的新数据。而SQLAlchemy的异步连接(使用create_async_engine)在默认配置下,每次操作后可能自动提交了事务,因此能获取到最新数据。可以在psql中执行ROLLBACK后再查询,验证是否能看到数据。数据库/Schema不匹配
检查psql连接的数据库和SQLAlchemy使用的DATABASE_URL是否指向同一个实例、同一个数据库。另外,若表在非默认Schema下(比如自定义的scraped_schema),psql默认可能未设置对应搜索路径,导致查询的是publicschema下的空表,而SQLAlchemy的连接可能指定了正确的Schema。可以在psql中执行SHOW search_path;查看当前搜索路径,或者用SELECT * FROM your_schema.scraped_data;指定Schema查询。表名大小写问题
如果创建scraped_data表时使用了双引号(比如CREATE TABLE "Scraped_Data"),PostgreSQL会保留大小写。此时psql中直接写SELECT * FROM scraped_data;会被自动转换为小写,实际查询的是全小写的scraped_data表(若存在),而SQLAlchemy可能在查询时正确使用了带引号的表名,从而能查到数据。可以在psql中尝试SELECT * FROM "Scraped_Data";(对应实际表名的大小写)验证。连接缓存与快照
psql的长期连接可能处于旧的事务快照中,即使其他连接提交了数据,当前事务也只能看到事务开始前的状态。可以关闭psql连接重新打开,再执行查询,看是否能获取到最新数据。
内容的提问来源于stack exchange,提问作者gbiz123

