您已将关联表映射到一个类。将关联对象与多对多关系结合起来是非常不寻常的,并且可能会给您带来一些痛苦。如果关联表没有任何其他感兴趣的列,您可以删除映射
并使用多对多关系:
编辑:我错过了您正在执行每个表反射而不是完整数据库反射的事实;对于多对多,您必须告诉 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")