我想使用 SQLalchemy 执行左外连接并过滤掉连接表中确实匹配的行。
我正在发送推送通知,所以我有一个 Notification
表。这意味着我还有一个 ExpiredDeviceId
表来存储不再有效的 device_id。 (我不想只删除受影响的通知,因为用户可能稍后会重新安装应用程序,此时通知应该根据 Apple 的文档恢复。)
CREATE TABLE Notification (device_id TEXT, time DATETIME);
CREATE TABLE ExpiredDeviceId (device_id TEXT PRIMARY KEY, expiration_time DATETIME);
注意:每个 device_id 可能有多个通知。每个设备都没有“设备”表。
所以在执行 SELECT FROM Notification
时,我应该进行相应的过滤。我可以在 SQL 中做到这一点:
SELECT * FROM Notification
LEFT OUTER JOIN ExpiredDeviceId
ON Notification.device_id = ExpiredDeviceId.device_id
WHERE expiration_time IS NULL
但是我如何在 SQLalchemy 中做到这一点?
sess.query(
Notification,
ExpiredDeviceId
).outerjoin(
(ExpiredDeviceId, Notification.device_id == ExpiredDeviceId.device_id)
).filter(
???
)
或者,我可以使用 device_id NOT IN (SELECT device_id FROM ExpiredDeviceId)
子句来执行此操作,但这似乎效率较低。
最佳答案
您需要在元组中拉回 ExpiredDeviceId 吗?如果您不这样做(即您只关心实时 device_ids),那么您就不能这样做:
sess.query(
Notification
).outerjoin(
(ExpiredDeviceId, Notification.device_id == ExpiredDeviceId.device_id)
).filter(
ExpiredDeviceId.expiration_time == None
)
关于python - 在 SQLalchemy 中过滤左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4629684/