запрос sqlalchemy с условием дочерних отношений

У меня есть следующие модели в sqlalchemy:

class Magazine(db.Model):

    id= db.Column(db.Integer, primary_key=True)
    name= db.Column(db.String(50))
    issues= db.relationship('Issue', backref='magazine', lazy='dynamic')

class Issue(db.Model):
    id= db.Column(db.Integer, primary_key=True)
    magazine_id= db.Column(db.Integer, db.ForeignKey('magazine.id'))
    date= db.Column(db.Date)

Журналы содержат названия журналов, а выпуски содержат номера каждого журнала. Это еженедельные журналы, поэтому поле date в Issue — это день выпуска.

Я пытаюсь построить запрос, чтобы выбрать все журналы, у которых нет номера на определенную дату. Как проще всего это сделать?


person applechief    schedule 31.10.2012    source источник


Ответы (1)


Поскольку это помечено sql, я предполагаю, что вы в порядке с правильным SQL, а не с тем, что использует SQLAlchemy. Это должно быть подсказкой о том, как выразить то же самое в SQLAlchemy.

SELECT *
FROM magazine m
WHERE NOT EXISTS (
  SELECT 1 FROM issue i WHERE i.magazine_id = m.id AND i."date" = $1
);

$1 — параметр даты; в Python это может быть %s или ?... какой бы ни был заполнитель параметра вашего языка.

Кстати, "date" — ужасное имя для столбца. Его нужно везде заключать в двойные кавычки, потому что это имя типа и зарезервированное слово SQL.

person Craig Ringer    schedule 31.10.2012
comment
Это работает, спасибо. Если кому-то нужны инструкции для синтаксиса WHERE NOT EXISTS в sqlalchemy, проверьте это mynthon.net/howto/-/python/ - person applechief; 31.10.2012