python - 在 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 条记录
解决方案
问题出在“日期”列中,它的数据类型是 TIMESTAMP WITH TIME ZONE
并且它设置为 CET 时区。在 Datagrip 或任何其他应用程序上运行查询时,应用程序的时区默认设置为本地时间(在本例中为 CET)。但是当通过 SQLAlchemy 运行相同的查询时,默认情况下时区设置为 UTC,这就是结果不同的原因。
我通过将时区传递给连接参数来修复:
engine = create_engine(CONN_STR, connect_args={'sslmode': 'require', 'options': '-c timezone=cet'})
推荐阅读
- reactjs - ReactCSSTransitionGroup 导致动态输入字段不可点击
- c++ - 如何强制采用数组引用的构造函数参与复制列表初始化?
- c# - 与 3d 相比,为什么 AddForce 需要不同的 2d 语法?
- jquery - 使用jquery获取一组元名称中的较大数字
- datetime - 在SAS范围内满足特定条件时删除行
- svg - Pixi.JS 虚线(或虚线)贝塞尔曲线
- java - 在 IntelliJ 中创建评论 @return 和 @param 的快捷方式是什么?
- python - 从初始值开始的数字的累积差
- python - 如何读取列由双引号和空格分隔的csv文件
- javascript - 无法在 React 应用程序的 Date 中正确减少天数