zoukankan      html  css  js  c++  java
  • python flask_sqlalchemy 多态 polymorphic 实现单表继承

    sqlalchemy 多态 polymorphic 实现单表继承

    sqlaclchemy中的单表继续就是以一个模型类为基类,其他模型类继承基类,所有模型类的的数据都存一张表里面(也可以是多张,只不过基类模型类的字段是共享的)

    下面建立三个模型类(表)

    class Human(db.Model):
        __tablename__ = 'human'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))
        gender = db.Column(db.Integer)  # 1: man 2: woman
        __mapper_args__ = {
            'polymorphic_on': gender,  # 指定了多态表哪个字段区分该条记录是属于哪个继承表
        }
    
    
    class Man(Human):
        __tablename__ = 'man'
        id = db.Column(db.Integer, db.ForeignKey('human.id', onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
        man = db.Column(db.String(50))
        other = db.Column(db.String(50))
        __mapper_args__ = {
            'polymorphic_identity': 1,  # 当gender=1时的表记录为Man
        }
    
    
    class Woman(Human):
        __tablename__ = 'woman'
        id = db.Column(db.Integer, db.ForeignKey('human.id', onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
        woman = db.Column(db.String(50))
        __mapper_args__ = {
            'polymorphic_identity': 2,  # 当gender=2时的表记录为Woman
        }
    
    

    Man 和 Woman类都继承了Human类,我们在类里面通过__mapper_args__参数来定义多态表,以及区分继续表。

    当我们想查询man所有的数据时:

    Man.query.all()
    

    相当于:

    select * from human where gender=1
    
  • 相关阅读:
    狄利克雷卷积
    洛谷P2044 [NOI2012]随机数生成器
    Miller Rabin算法详解
    BZOJ3667: Rabin-Miller算法
    洛谷P3383 【模板】线性筛素数(Miller_Rabin)
    洛谷P3806 【模板】点分治1
    BZOJ1468: Tree
    Android Camera调用过程分析
    安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中
    Android抖动动画
  • 原文地址:https://www.cnblogs.com/guapitomjoy/p/14366900.html
Copyright © 2011-2022 走看看