理解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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人