zoukankan      html  css  js  c++  java
  • 理解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

  • 相关阅读:
    python 可变数据类型&不可变数据类型
    java异常 总结
    java 进制转换
    在virtualbox下使用vm映像文件
    关于C语言中单双引号的问题
    php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
    fastadmin model关联模型 关联查询问题
    php 解决跨域问题
    微信支付相关
    TP5之事务处理
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/12658931.html
Copyright © 2011-2022 走看看