SQLAlchemy - Как отобразить ManyToMany с использованием таблиц ассоциаций с автозагрузкой - PullRequest
1 голос
/ 27 сентября 2011

Я загружаю базу данных 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 Ответ

6 голосов
/ 27 сентября 2011

Вы сопоставили таблицу ассоциации с классом.Это очень необычно и, вероятно, вызовет у вас некоторую боль при объединении объекта ассоциации с отношением «многие ко многим».Если таблица сопоставления не имеет других интересующих столбцов, вы можете отбросить сопоставление и использовать отношение «многие ко многим»:

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