更新SqlAlchemy多对多关联表中的值

4 投票
1 回答
8523 浏览
提问于 2025-04-16 12:19

根据下面的表格,我该怎么更新一个用户所属的组呢?我感觉我可能漏掉了什么简单的东西,但到现在为止我还没找到任何能告诉我怎么做的资料。

group_permission_table = Table('group_permission', metadata,
    Column('group_name', Integer, ForeignKey('group.group_name', onupdate="CASCADE", ondelete="CASCADE")),
    Column('permission_name', Integer, ForeignKey('permission.permission_name', onupdate="CASCADE", ondelete="CASCADE"))
)

user_group_table = Table('user_group', metadata,
    Column('user_name', Integer, ForeignKey('user.user_name', onupdate="CASCADE", ondelete="CASCADE")),
    Column('group', Integer, ForeignKey('group.group_name', onupdate="CASCADE", ondelete="CASCADE"))
)

class Group(Base):
    """An ultra-simple group definition.
    """
    __tablename__ = 'group'

    group_name = Column("group_name", Text(), primary_key=True)

    users = relationship('User', secondary=user_group_table, backref='groups')

class User(Base):
    """Reasonably basic User definition. Probably would want additional
    attributes.
    """
    __tablename__ = 'user'

    user_name = Column("user_name", Text(), primary_key=True)
    _password = Column('password', Text)
    email = Column('email', Text())

有人能帮忙吗?这个问题应该挺常见的。我该怎么更新一个关联表里的内容?如果我不能在里面更新某个项目,那我又该怎么删除那里的某一行呢?

1 个回答

8

你不需要手动从M2N关系表中删除任何东西。当你从group.users中删除一个用户,然后执行commit来保存你的更改时,关系表中的数据会自动更新(根据情况插入或删除)。你可以通过设置echo=True来查看这些SQL语句,确认这一点。

engine = create_engine(..., echo=True)

删除的过程是这样的:

...
my_user = session.query(User).get(USR_ID)
my_group = session.query(User).get(GRP_ID)
my_group.users.append(my_user)
session.commit() # SA will insert a relationship row
my_group.users.remove(my_user)
session.commit() # SA will delete a relationship row

撰写回答