理解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