【问题标题】:same sql statment gives different results when run on sqlalchemy DBAPI在 sqlalchemy DBAPI 上运行时,相同的 sql 语句给出不同的结果
【发布时间】:2020-06-09 19:28:50
【问题描述】:

当我在 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 条记录

【问题讨论】:

  • 您期望有多少条记录?你得到的不同计数是什么?它总是相同的不同计数吗?
  • 哪个应用程序给出了正确的结果?
  • @AndyLester 是的,差异总是一样的,比实际少 3000 条记录
  • @snakecharmerb datagrip 返回正确结果

标签: python postgresql sqlalchemy


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2018-01-02
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多