Я новичок в SqlAlchemy. рассмотрим следующую таблицу (states_violations)
s_id v_id
1 1
2 1
2 2
2 3
2 5
2 6
2 7
3 1
3 2
3 6
3 7
3 8
4 1
and so on
Здесь я хочу записи s_id = 2, которые недоступны в s_id = 3 (v_id 3 и 5)
Вывод, который мне нужен
s_id v_id
2 3
2 5
Используя следующие запросы, я могу получить вывод
Запрос 1: Присоединиться к запросу:
SELECT a.* FROM states_violations a
LEFT JOIN states_violations b
ON a.v_id = b.v_id
AND b.s_id=3
WHERE a.s_id=2
AND b.v_id IS NULL
Запрос 2: Вложенный запрос:
SELECT states_violations.* FROM states_violations
WHERE s_id = 2
AND v_id NOT IN (
SELECT v_id FROM states_violations
WHERE s_id = 3
)
Модельный класс на питоне:
# Many-to-many relation between states and violations
states_violations = Table(
'states_violations', Base.metadata,
Column('s_id', Integer, ForeignKey('states_table.id')),
Column('v_id', Integer, ForeignKey('violations_table.id'))
)
class State(Base):
__tablename__ = "states_table"
...
violations = relationship("Violation", secondary=states_violations,
backref="states", lazy='dynamic')
class Violation(Base):
__tablename__ = "violations_table"
...
Я хочу преобразовать вышеупомянутые 2 запроса в SqlAlchemy session.query.
Так как states_violations - это отношение «многие ко многим» между состоянием и моделью нарушения, как мы можем преобразовать это в запрос SqlAlchemy?