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、繼承表的每行的數據是分別保存在兩個表中的。