理解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、继承表的每行的数据是分别保存在两个表中的。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值