You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy自引用多对多关系中back_populates无法自动更新反向关联

多对多关系中back_populates无法自动更新反向集合的问题

我正在开发一个精简词典API,目前在数据库层遇到了问题。

我的数据库模型定义如下(可按需排除字段):

translations = Table(
    "translations",
    Base.metadata,
    Column("left_id", ForeignKey("words.id"), primary_key=True),
    Column("right_id", ForeignKey("words.id"), primary_key=True),
)

class Word(Base):
    __tablename__ = "words"

    id: Mapped[int] = mapped_column(primary_key=True)
    value: Mapped[str] = mapped_column(String(24))
    translation: Mapped[Set["Word"]] = relationship(
        secondary=translations,
        primaryjoin=id == translations.c.left_id,
        secondaryjoin=id == translations.c.right_id,
        lazy="joined",
        back_populates="translation",
    )

我的问题是back_populates没有提供自动更新的功能。执行以下代码后:

""" 假设session已创建 """
w1 = Word(value="bonjour")
w2 = Word(value="hello")
s.add_all([w1, w2])
w1.translation.add(w2)
await s.commit()

w2.translation仍然是空集合。

补充说明
是的,该字段名为translation,但这是多对多关系。我现在需要实现一种可以将多个单词关联在一起的方法。手动处理反向引用会让逻辑变得过于复杂,所以这不是一个好方案,比如我写的这个link函数:

def link(session, *args):
    for idx, word in enumerate(args[:-1]):
        word.translation.add(*[arg for arg in args if arg != word])
        # word.translation.add(*args[:idx], *[idx+1:])
    session.commit()

内容的提问来源于stack exchange,提问作者Inbasu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:33:14