你好,
我有以下 SQL,我正在将其转换为 SQLAlchemy:
select t1.`order_id`, t1.`status_type`
from `tracking_update` AS t1 LEFT JOIN `tracking_update` AS t2
ON (t1.`order_id` = t2.`order_id` AND t1.`last_updated` < t2.`last_updated`)
where t1.`order_id` = '21757'and t2.`last_updated` IS NULL
SQL 只是返回订单 ID 21757 的最新跟踪更新。我通过向同一个表执行左连接来完成此操作。为了做到这一点,我首先为表格设置了别名:
tUAlias1 = aliased(TrackingUpdate)
tUalias2 = aliased(TrackingUpdate)
到目前为止,这是我转换到 SQLAlchemy 的结果:
tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\
outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\
filter(and_(tUAlias1.order_id == '21757', tUalias2.last_updated is None))
这是通过日志在服务器上执行的 SQLAlchemy 代码的结果:
SELECT tracking_update_1.order_id AS tracking_update_1_order_id, tracking_update_1.status_type AS tracking_update_1_status_type
FROM tracking_update AS tracking_update_1 LEFT OUTER JOIN tracking_update AS tracking_update_2 ON tracking_update_1.order_id = tracking_update_2.order_id AND tracking_update_1.last_updated < tracking_update_2.last_updated
WHERE 0 = 1
如您所见,过滤器(WHERE 子句)现在为 0 = 1。
现在,如果我删除 and_ 语句并像这样尝试两个过滤器:
tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\
outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\
filter(tUAlias1.order_id == '21757').filter(tUalias2.last_updated is None)
我收到了相同的结果。我知道 SQL 本身很好,因为我可以通过 MySQL Workbench 毫无问题地运行它。
当SQL直接运行时,会收到如下信息
order ID | Status
21757 D
此外,如果我删除 tUalias2.last_updated is None,我实际上会收到一些结果,但它们不正确。这是 SQL 日志:
Python代码
tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\
outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\
filter(tUAlias1.order_id == '21757')
SQLAlchemy 运行:
SELECT tracking_update_1.order_id AS tracking_update_1_order_id, tracking_update_1.status_type AS tracking_update_1_status_type
FROM tracking_update AS tracking_update_1 LEFT OUTER JOIN tracking_update AS tracking_update_2 ON tracking_update_1.order_id = tracking_update_2.order_id AND tracking_update_1.last_updated < tracking_update_2.last_updated
WHERE tracking_update_1.order_id = '21757'
有什么想法吗?
最佳答案
你好,
我想通了
Python 的 'is' 运算符不能很好地与 SQLAlchemy 搭配使用
由于以下 S/O 问题,我发现了这一点:
Selecting Null values SQLAlchemy
我已将我的查询更新为以下内容:
tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\
outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\
filter(tUAlias1.order_id == '21757').filter(tUalias2.last_updated == None)
关于python - SQLAlchemy 左联接 WHERE 子句被转换为零和一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642053/