SQLAlchemy - 如何使用自动加载的关联表映射ManyToMany

MFB*_*MFB 1 many-to-many sqlalchemy

我正在自动加载MSSQL数据库.有几个ManyToMany关联表.我不确定如何映射每一方.以下是它们在db中的外观的典型示例:

Table: tbUsersToGroups
PK: ID_UserToGroup
FK: User_ID
FK: Group_ID
Run Code Online (Sandbox Code Playgroud)

所以我可以在下面成功地自动加载关联表和用户和组表,但是我试图映射边的所有内容都失败了.

class UserToGroup(Base):
    __tablename__ = 'tbUsersToGroups'
    __table_args__ = {'autoload':True,'extend_existing':True,'schema':'dbo'}
Run Code Online (Sandbox Code Playgroud)

class User(Base):
    __tablename__ = 'tbUsers'
    __table_args__ = {'autoload':True,'schema':'dbo'}
Run Code Online (Sandbox Code Playgroud)

class Group(Base):
    __tablename__ = 'tbGoups'
    __table_args__ = {'autoload':True,'schema':'dbo'}
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒.

Sin*_*ion 6

您已将关联表映射到类.这是非常不寻常的,可能会让你很难将关联对象与多对多关系结合起来.如果关联表没有任何其他感兴趣的列,则可以删除映射并使用多对多关系:

编辑:我错过了你正在进行每桌反射的事实,而不是完整的数据库反射; 对于多对多,您必须告诉sqlalchemy关于该表,但不将其映射到类:

user_to_groups_table = sqlalchemy.Table('tbUsersToGroups', Base.metadata,
                   autoload=True,
                   extend_existing=True
                   schema='dbo')

class User(Base):
    __tablename__ = 'tbUsers'
    __table_args__ = {'autoload':True,'schema':'dbo'}

class Group(Base):
    __tablename__ = 'tbGoups'
    __table_args__ = {'autoload':True,'schema':'dbo'}
    users = relationship(User, secondary=user_to_groups_table, backref="groups")
Run Code Online (Sandbox Code Playgroud)

如果,你想有一个面向对象的访问的关联表列时,应使用两个单对多的关系,涉及三大类; (可选)您还可以使用关联代理来获取方便的多对多属性,以便在需要偶尔使用这些额外列时(并且它们具有默认值):

from sqlalchemy.ext.associationproxy import association_proxy
class UserToGroup(Base):
    __tablename__ = 'tbUsersToGroups'
    __table_args__ = {'autoload':True,'extend_existing':True,'schema':'dbo'}

class User(Base):
    __tablename__ = 'tbUsers'
    __table_args__ = {'autoload':True,'schema':'dbo'}
    usergroups = relationship(UserToGroup, backref="user")
    groups = association_proxy("usergroups", "group")

class Group(Base):
    __tablename__ = 'tbGoups'
    __table_args__ = {'autoload':True,'schema':'dbo'}
    usergroups = relationship(UserToGroup, backref="group")
    users = association_proxy("usergroups", "user")
Run Code Online (Sandbox Code Playgroud)