gpt4 book ai didi

python - 使用 SQLAlchemy 在两秒内过滤对象

转载 作者:太空狗 更新时间:2023-10-30 01:17:35 25 4
gpt4 key购买 nike

我有两个表,其中有一列是“日期”。一个保存 (name, date),另一个保存 (date, p1, p2)。给定一个名字,我想用表1中的日期从表2中查询p1和p2;如果表一中的日期在表二中的日期的两秒内,则匹配应该发生。

如何使用 SQLAlchemy 完成此操作?

我已经尝试(未成功)使用 between 运算符并使用如下子句:

td = datetime.timedelta(seconds=2)
q = session.query(table1, table2).filter(table1.name=='my_name').\
filter(between(table1.date, table2.date - td, table2.date + td))

有什么想法吗?

编辑:我已经设法使用以下方法解决了这个问题:

from sqlalchemy.sql import between
import datetime
# [all other relevant imports]

td = datetime.timedelta(seconds=2)
t1_entry = session.query(table_1).filter(table_1.name == 'the_name').first()
if t1_entry is not None:
tmin = t1_entry.date - td
tmax = t1_entry.date + td
t2_entry = session.query(table_2).filter(between(table_2.date, tmin, tmax)).first()
return (t1_entry, t2_entry)
return None

因此可以进行比较,但我不确定该方法是否有效。

最佳答案

首先让我解释一下为什么您尝试的方法不起作用。 SQLAlchemy 只是一种编写 SQL 查询的便捷方式,所有查询仍然发生在远程端。 SQLAlchemy 列是特殊对象,其__eq____gt__ 等方法被覆盖以返回不是TrueFalse,而是其他特殊对象,它们会记住与它们进行比较的对象是什么,并且可以在以后生成适当的 SQL 语句。添加等也是如此:自定义__add____sub__ 方法不返回数字或连接的字符串,而是返回生成sql 语句的此类对象。您可以将它们与字符串、整数等、其他列、选择语句、mysql 函数调用等进行比较/添加,但不能与 timedeltas 等特殊 python 对象进行比较。(已简化,技术上可能不是 100% 正确; ) )

所以你可以做的是:

  • 将数据库中的值设为整数,例如 unix 时间戳。这样你的 between 查询就会工作(使用 2 而不是增量)
  • 使用数据库端函数将日期时间格式日期转换为 unix 时间戳,然后进行比较。

更新:我试了一下,不知何故它确实有效,甚至有一个 Interval数据类型。但是至少在这里它不能正常工作:

MySQL:

>>> db.session.execute(db.select([User.date_joined, User.date_joined + timedelta(seconds=2)], limit=1)).fetchall()
[(datetime.datetime(2009, 7, 10, 20, 47, 33), 20090710204733.0)]
>>> db.session.execute(db.select([User.date_joined, User.date_joined + 2], limit=1)).fetchall()
[(datetime.datetime(2009, 7, 10, 20, 47, 33), 20090710204735.0)]
>>> db.session.execute(db.select([User.date_joined+0, User.date_joined + 2], limit=1)).fetchall()
[(20090710204733.0, 20090710204735.0)]

SQLite:

>>> db.session.execute(db.select([User.date_joined, User.date_joined + timedelta(seconds=2)], limit=1)).fetchall()
TypeError: expected string or buffer
>>> db.session.execute(db.select([User.date_joined, User.date_joined + 2], limit=1)).fetchall()
[(datetime.datetime(2010, 5, 28, 23, 8, 22, 476708), 2012)]
>>> db.session.execute(db.select([User.date_joined+0, User.date_joined + 2], limit=1)).fetchall()
[(2010, 2012)]

我不知道为什么第一个在 MySQL 上失败以及为什么它返回 float 。 SQLite 错误似乎发生是因为 SQLite does not have a DATETIME data type and SQLAlchemy stores it as a string .

您必须稍微尝试一下,也许您会找到一种可行的方法 - 但我认为要真正独立于 dbms,整数方法将是唯一可行的方法。

关于python - 使用 SQLAlchemy 在两秒内过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com