Фильтрация по левому соединению в SQLalchemy

Используя SQLalchemy, я хочу выполнить левое внешнее соединение и отфильтровать строки, которые ДОЛЖНЫ иметь совпадения в объединенной таблице .

Я отправляю push-уведомления, так что у меня есть таблица уведомлений . Это означает, что у меня также есть таблица ExpiredDeviceId для хранения недействительных идентификаторов устройств. (Я не хочу просто удалять затронутые уведомления, поскольку пользователь может позже переустановить приложение, после этого уведомления должны возобновиться в соответствии с документами 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) , но это кажется подходящим менее эффективен.

18
задан Ilja Everilä 11 January 2018 в 22:42
поделиться