python - 带有软删除的 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;
解决方案
我认为您可以使用关系 objprimaryjoin
的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"
)
对于 ref,您可以在docs中阅读更多内容。
推荐阅读
- sql-server - 发布时 KingswaySoft SSIS 错误 - 需要密码
- python-3.x - 获取 2 个单独的 tkinter 窗口,而不是浏览 3 个页面
- c# - 如何在行项目之间添加空格
- cefsharp - How to prevent Winform popup box CefSharp.BrowserSubprocess.exe Breakpoint A has been reached?
- axon - 是否可以使用 axon 3.3.3 将所有事件存储在微服务架构中的中央 RDBMS 数据库中?
- python - LSTM with rule-based features?
- c++ - 在 Visual Studio Code 中使用 C++ 进行调试时如何读取输入?
- javascript - 在数组由从 mongodb 获得的值填充后,将数组作为 JSON 响应发送
- regex - 应用带有条件环视的正则表达式
- javascript - How do I get information about whether any sound is playing via Web Audio?