首页 > 解决方案 > 带有软删除的 SQLAlchemy 关联表

问题描述

我正在尝试将我的 SQLAlchemy 模型配置为使用关联表来建立关系。我遇到的问题是关联表有一列“已删除”。如果关系已被删除(软删除) ,我找不到告诉 SQLAlchemy不要返回关联对象的方法。

这是一个例子:

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)
)

上面的示例将始终返回关系。我需要将关系更改为仅在“removed==0”时返回。

感谢您对此的任何帮助。

我知道我希望 SQLAlchemy 进行的 SQL 查询是:

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;

标签: pythonsqlalchemy

解决方案


我认为您可以使用关系 objprimaryjoinsecondaryjoin属性,然后添加条件以仅过滤未删除的行。

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"
    )

对于 ref,您可以在docs中阅读更多内容。


推荐阅读