SqlAlchemy链接表

时间:2017-06-15 15:09:06

标签: python sql database sqlalchemy

所以使用SQLAlchemy我想创建3个表

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 | john.smith@700.com

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 个答案:

答案 0 :(得分:1)

您的表格结构类似于joined table inheritanceobjects.obj_typediscriminator

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='john.smith@700.com'))

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

In [8]: session.commit()

并检查我们可以polymorphically查询所有Objs:

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', 'john.smith@700.com')]

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