2011-09-26 88 views
1

我自動加載MSSQL數據庫。有幾個ManyToMany關聯表。我不知道如何映射每一面。以下是他們在DB如何看一個典型的例子:SQLAlchemy - 如何使用自動加載關聯表映射ManyToMany

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

所以我可以成功地自動加載該assoc命令表,並按照以下的用戶和組表,但一切我試圖向兩側映射失敗。

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

任何幫助將是巨大的。

回答

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

感謝@TokenMacGuy。當我嘗試你的第一個例子時,我得到一個InvalidRequestError(基本上)說'tbUsersToGroups'沒有被定義。所以然後我嘗試定義一個自動加載類'UserToGroup',但後來我得到一個AttributeError'UserToGroup'沒有foreign_keys。但是我可以通過在UserToGroup().__ table __。foreign_keys:f'中爲f來查看外鍵。任何線索? – MFB

+0

我不經常使用'autoload'而沒有完整的數據庫反射,所以我錯過了對錶格聲明的需求;請參閱我的編輯。 – SingleNegationElimination

+0

我不能在此實例中使用完整數據庫反射的唯一原因(除非您知道解決此問題的方法)是有兩次,我必須覆蓋由服務器生成的MSSQL TIMESTAMP列的列定義,這意味着SA無法插入。無論如何,我現在給你編輯的版本。再次感謝 – MFB