理解SQLAlchemy的表继承关系(1)--Joined Table Inheritance

Joined Table Inheritance指通过外健方式进行链接实现的继承方式。

举个例子理解,共三个ORM类:

 Employee:员工,基类,具有id,name两个共有字段
Manager:经理,继承Employee
 Engineer:工程师,继承Employee,
在本例中,SQLAlchemy将会创建三个表,Employee,Manager,Engineer

class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String(50))
type = Column(String(50))
__mapper_args__ = {
'polymorphic_identity':'employee',
'polymorphic_on':type
}
以上Employee是一个基类,其中id,name字段是可以让子类继承的,要被继承的关健是要配置

__mapper_args__里面的polymorphic_identity和polymorphic_on的两个参数。

polymorphic_on=“type"表明该employee表的type字段是用来标识该数据记录是属于哪个子类的,一般使用字符串字段均可,名称不限。

polymorphic_identity="employee"则说明,如果你新建一个Employee(name="员工")时,Employee.type="employee",说明只是普通的员工。

 

class Engineer(Employee):
__tablename__ = 'engineer'
id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
engineer_name = Column(String(30))
__mapper_args__ = {
'polymorphic_identity':'engineer',
}
class Manager(Employee):
__tablename__ = 'manager'
id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
manager_name = Column(String(30))
__mapper_args__ = {
'polymorphic_identity':'manager',
}

Enginner和Manager均继承自Employee,SQLAlchemy会创建两个对应的数据库表Manager和Engineer。

建立的Engineer表只有id和engineer_name两个字段,Managert只有id和manager_name两个字段。

通过id外健关联到Employee表的一条记录,而Employee表使用一个额外的字段来标识该字录是属于Manager或Engineer.

 

polymorphic_identity配置值可以是任意值,不一定是上述例子中的,比如你可以让engineer类的polymorphic_identity=“a”,而Manager类的polymorphic_identity=“b”

polymorphic_identity配置项只是用来在Employee表的type字段的标识值。

在上例中,当您新增加一个Enginner实例时:

e=Enginner(name="张三",emgineer_name="高级工程师")
session.add(e)
session.commit()

SQLAlchemy会在数据库表Employee中添加一行
id         name         type

---------------------------------------------

1         张三           engineer

 

然后在数据库表Enginner中添加一行:

id         engineer_name

---------------------------------------------

1         高级工程师


两个表是通过一个外健关联起来的。

 

当你使用查询Engineer时,返回的Engineer具有完整的字段:id, name,engineer_name

其是name值是从Emplloyee表中取的。

 

 

小结:

1、该种继承是通过外健在基表和继承表之间建立关联。

2、基表使用polymorphic_on指定一个字段来保存继承表的名称。

3、每个继承表添加的行均在基表中有一个一对一的行。

4、继承表的polymorphic_identity值可以任意指定,一般使用继承表的名称。

5、继承表的每行的数据是分别保存在两个表中的。
原文链接:https://blog.csdn.net/wenxuansoft/article/details/50233557

posted on 2020-04-08 11:44  不要挡着我晒太阳  阅读(593)  评论(0编辑  收藏  举报

导航