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

Cha*_*lie 3 python sqlalchemy

根据下表,如何更新用户所在的组?我觉得我必须丢失一些显而易见的东西,但是到目前为止,我还没有发现任何显示该操作方法的东西。

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())
Run Code Online (Sandbox Code Playgroud)

有人吗 这必须是一个相当普遍的问题。您如何更新关联表中的内容?如果我无法在那里更新项目,该如何删除那里的行?

van*_*van 6

您无需从M2N关系表中明确删除任何内容。当您从中删除用户group.users,然后进行commit更改时,关系表中的数据将被更新(相应地插入或删除)。您可以通过使用echo=True

engine = create_engine(..., echo=True)
Run Code Online (Sandbox Code Playgroud)

删除的工作方式如下:

...
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
Run Code Online (Sandbox Code Playgroud)