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

时间:2011-09-26 23:46:18

标签: many-to-many sqlalchemy

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

Table: tbUsersToGroups
PK: ID_UserToGroup
FK: User_ID
FK: Group_ID

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

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'}

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

任何帮助都会很棒。

1 个答案:

答案 0 :(得分: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")

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

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")