我正在自动加载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'}
任何帮助都会很棒。
答案 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")