2017-06-15 49 views
0

因此,與SQLAlchemy的我要創建3個表SQLAlchemy的鏈接表

Obj 
obj_id | obj_type 

User 
user_id | obj_id | name | mail 

Society 
society_id | obj_id | name 

因此可以說,我推3個要素,我想有這樣的事情:

Obj 
obj_id | obj_type 
1  | society 
2  | user 
3  | society 

User 
user_id | obj_id | name | mail 
1  | 2  | John | [email protected] 

Society 
society_id | obj_id | name 
1   | 1  | Google 
2   | 3  | Facebook 

我如何構造我的代碼和添加/提交,所以我鏈接我的表?

class Obj(Base): 
    __tablename__ = 'objects' 
    obj_id = Column(Integer, primary_key=True) 
    obj_type = Column(String(30)) 

class User(Base): 
    __tablename__ = 'users' 
    user_id = Column(Integer, primary_key=True) 
    obj_id = Column(Integer, ForeignKey('objects.obj_id')) 
    name = Column(String(100), default=None) 
    mail = Column(String(200), default=None) 
    objects = relationship("Obj", back_populates="users") 

class Society(Base): 
    __tablename__ = 'society' 
    society_id = Column(Integer, primary_key=True) 
    obj_id = Column(Integer, ForeignKey("objects.obj_id")) 
    name = Column(String(100), default=None) 
    objects = relationship("Obj", back_populates="society") 
    people = relationship("People", back_populates="society") 

回答

1

你的表結構類似於joined table inheritance,與objects.obj_type作爲discriminator

In [2]: class Obj(Base): 
    ...:  __tablename__ = 'objects' 
    ...:  obj_id = Column(Integer, primary_key=True) 
    ...:  obj_type = Column(String(30)) 
    ...:  __mapper_args__ = { 
    ...:   'polymorphic_identity': 'object', 
    ...:   'polymorphic_on': obj_type 
    ...:  } 
    ...:  

In [3]: class User(Obj): 
    ...:  __tablename__ = 'users' 
    ...:  user_id = Column(Integer, primary_key=True) 
    ...:  obj_id = Column(Integer, ForeignKey('objects.obj_id')) 
    ...:  name = Column(String(100), default=None) 
    ...:  mail = Column(String(200), default=None) 
    ...:  __mapper_args__ = { 
    ...:   'polymorphic_identity': 'user' 
    ...:  } 
    ...:  

In [4]: class Society(Obj): 
    ...:  __tablename__ = 'society' 
    ...:  society_id = Column(Integer, primary_key=True) 
    ...:  obj_id = Column(Integer, ForeignKey("objects.obj_id")) 
    ...:  name = Column(String(100), default=None) 
    ...:  ... 
    ...:  __mapper_args__ = { 
    ...:   'polymorphic_identity': 'society' 
    ...:  } 
    ...:  

注意,你不需要爲了將它們鏈接到其相關的OBJ在子類的對象關係。您可以像繼承時一樣訪問父級的屬性。

添加3個要素:

In [6]: session.add(User(name='John', mail='[email protected]')) 

In [7]: session.add_all([Society(name='Google'), Society(name='Facebook')]) 

In [8]: session.commit() 

並檢查我們可以polymorphically查詢所有OBJ文件:

In [9]: session.query(Obj).all() 
Out[9]: 
[<__main__.User at 0x7f37b5aaa780>, 
<__main__.Society at 0x7f37b5aaab00>, 
<__main__.Society at 0x7f37b5aaacc0>] 

你也可以檢查一下表實際上包含:

In [10]: session.query(Obj.__table__).all() 
Out[10]: [(1, 'user'), (2, 'society'), (3, 'society')] 

In [11]: session.query(User.__table__).all() 
Out[11]: [(1, 1, 'John', '[email protected]')] 

In [12]: session.query(Society.__table__).all() 
Out[12]: [(1, 2, 'Google'), (2, 3, 'Facebook')]