所以使用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")
答案 0 :(得分: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='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')]