【发布时间】:2011-06-05 12:09:56
【问题描述】:
我想使用 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) 子句来做到这一点,但这似乎效率较低。
【问题讨论】:
标签: python sql join sqlalchemy