python - 在 SQLalchemy 中过滤左连接

标签 python sql join sqlalchemy

我想使用 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/

相关文章:

python - 检查几列中的日期并在 python 中创建一个新列

python - 调用 scipy griddata 时出现类型错误

python - 比较两个包含文本的日期列

c# - 使用 C# sql 对表的特定列的行进行求和

php - 如何在多行上使用相同ID连接MYSQL中的2个表

mysql - MySQL 中的 JOIN 查询产生错误的结果

python - 从 Pandas 中的 DatetimeIndex 列出月份和年份

sql - PostgreSQL 中的 "FOR UPDATE is not allowed with aggregate functions"

sql - postgresql to_json() 函数转义所有双引号字符

mysql - 查找没有匹配结果 SQL 的所有行