Python SQLalchemy中左连接的筛选

Python SQLalchemy中左连接的筛选,python,sql,join,sqlalchemy,Python,Sql,Join,Sqlalchemy,使用SQLalchemy,我希望执行一个左外部联接,并过滤出联接表中有匹配项的行 我正在发送推送通知,因此我有一个通知表。这意味着我还有一个ExpiredDeviceId表来存储不再有效的设备ID。我不想仅仅删除受影响的通知,因为用户稍后可能会重新安装应用程序,根据苹果的文档,此时通知应该恢复 CREATE TABLE Notification (device_id TEXT, time DATETIME); CREATE TABLE ExpiredDeviceId (device_id TEX

使用SQLalchemy,我希望执行一个左外部联接,并过滤出联接表中有匹配项的行

我正在发送推送通知,因此我有一个通知表。这意味着我还有一个ExpiredDeviceId表来存储不再有效的设备ID。我不想仅仅删除受影响的通知,因为用户稍后可能会重新安装应用程序,根据苹果的文档,此时通知应该恢复

CREATE TABLE Notification (device_id TEXT, time DATETIME);
CREATE TABLE ExpiredDeviceId (device_id TEXT PRIMARY KEY, expiration_time DATETIME);
注意:每个设备id可能有多个通知。每个设备没有设备表

因此,在执行SELECT FROM通知时,我应该相应地进行过滤。我可以在SQL中执行此操作:

SELECT * FROM Notification 
    LEFT OUTER JOIN ExpiredDeviceId 
    ON Notification.device_id = ExpiredDeviceId.device_id
WHERE expiration_time IS NULL
但是在炼金术中我怎么能做到呢

sess.query(
    Notification, 
    ExpiredDeviceId
).outerjoin(
    (ExpiredDeviceId, Notification.device_id == ExpiredDeviceId.device_id)
).filter(
    ???
)

或者,我可以在SELECT device id FROM EXPIREEDDEVICEID子句中不使用设备id来执行此操作,但这似乎效率较低。

是否需要在元组中回调EXPIREEDDEVICEID?如果您不关心,即您只关心实时设备的ID,那么您就不能:

sess.query(
    Notification
).outerjoin(
    (ExpiredDeviceId, Notification.device_id == ExpiredDeviceId.device_id)
).filter(
    ExpiredDeviceId.expiration_time == None
)

你说得对。我错误地假设ExpiredDeviceId实际上是一个对象引用,并且如果没有匹配的行,ExpiredDeviceId本身将为None。但是,它实际上是一个类表名,并且表达式被编译为有效的SQL。请注意,对于我的问题的措辞,我需要检查它是否为None,这也有效。啊,很好的一点,编辑了我的代码摘录以避免混淆ExpiredDeviceID.Expirement\u time IS None将不起作用-在传递给.filter之前,它将始终计算为False,如果希望像读取SQL一样读取查询,则会导致意外行为。使用==。