Используя 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)
, но это кажется подходящим менее эффективен.