SqlAlchemy - запрос левого соединения со многими связанными моделями - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...