Вы сопоставили таблицу ассоциации с классом.Это очень необычно и, вероятно, вызовет у вас некоторую боль при объединении объекта ассоциации с отношением «многие ко многим».Если таблица сопоставления не имеет других интересующих столбцов, вы можете отбросить сопоставление и использовать отношение «многие ко многим»:
Редактировать: я упустил тот факт, что вы делаете отражение для каждой таблицы, а не полное отражение базы данных;Для многих ко многим вы должны сообщить 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")