Таблица ассоциаций SQLAlchemy с мягким удалением - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь настроить свои модели SQLAlchemy на использование таблицы ассоциаций для отношения. У меня проблема в том, что в ассоциативной таблице есть столбец «удален». Я не могу найти способ указать SQLAlchemy not возвращать связанные объекты, если связь была удалена (мягко удалена).

Вот пример:

class A(Base):
    __tablename__ = "a"
    id = Column(Integer, primary_key=True)
    b_list = relationship("B", secondary=lambda: association_table, backref="a_list")

class B(Base):
    __tablename__ = "b"
    id = Column(Integer, primary_key=True)

association_table = Table(
    "a_b_association",
    metadata,
    Column("a_id", Integer, ForeignKey(A.id), primary_key=True),
    Column("b_id", Integer, ForeignKey(B.id), primary_key=True),
    Column("removed", Integer)
)

В приведенном выше примере всегда будет возвращаться связь. Мне нужно изменить отношение, чтобы оно возвращалось только при «удаленном == 0».

Спасибо за любую помощь с этим.

Я знаю, что SQL запрос, который я хочу, чтобы SQLAlchemy сделал:

SELECT A.id, B.id
FROM A
INNER JOIN a_b_association ON A.id=a_b_association.a_id
INNER JOIN B ON B.id=a_b_association.b_id
WHERE a_b_association.removed=0;

1 Ответ

1 голос
/ 10 июля 2020

Я думаю, вы можете использовать свойство primaryjoin и secondaryjoin объекта отношения, а затем добавить условие для фильтрации только неотдаленной строки.

class A(Base):
    __tablename__ = "a"
    id = Column(Integer, primary_key=True)
    b_list = relationship(
        "B", 
        secondary=association_table,
        primaryjoin=(association_table.c.a_id == id and association_table.removed == 0)
        backref="a_list"
    )

Для ссылки вы можете прочитать больше в документы .

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