首页 > 解决方案 > 在 sqlalchemy DBAPI 上运行时,相同的 sql 语句会给出不同的结果

问题描述

当我在 sqlalchemy DBAPI 和 datagrip 上运行相同的 sql select 语句时,它会给出不同的结果

CONN_STR = "postgresql://{}:{}@{}:5432/{}"\
        .format('DATABASE_USER','DATABASE_PASSWORD','DATABASE_HOST', 'DATABASE_NAME')

engine = create_engine(CONN_STR, connect_args={'sslmode': 'require'})

def run_sql_query(query):
    df = pd.read_sql_query(query, con=engine)
    return df

example_statement = """
select count(*) 
from users
where "date" >= '2020-05-01'
"""
result = run_sql_query(example_statement)

如果我直接在 datagrip 上运行此脚本,它将返回不同的计数,我在同一张表上尝试了不同的语句,并且同一张表上总是缺少 3000 条记录

标签: pythonpostgresqlsqlalchemy

解决方案


问题出在“日期”列中,它的数据类型是 TIMESTAMP WITH TIME ZONE并且它设置为 CET 时区。在 Datagrip 或任何其他应用程序上运行查询时,应用程序的时区默认设置为本地时间(在本例中为 CET)。但是当通过 SQLAlchemy 运行相同的查询时,默认情况下时区设置为 UTC,这就是结果不同的原因。

我通过将时区传递给连接参数来修复:

engine = create_engine(CONN_STR, connect_args={'sslmode': 'require', 'options': '-c timezone=cet'})

推荐阅读