• SQLAlchemy 使用(二)表关联


    前言

    在上一章中我们介绍了 SQLAlchemy 建立基本表,但是一般情况下,表之间是有关联的,比如 一对一/一对多/多对多,当然 SQLAlchemy 是支持建立model时指定关系的

    正文

    多对一/一对多

    我们建立两个表,VIP和VIP_info, 逻辑应该是一对一,我们先测试一对多

    class VIP(Base):
        # VIP用户
        __tablename__ = 'vip'  # 表名
        id = Column(Integer, primary_key=True)  # id
        name = Column(String(12), nullable=False, index=True, unique=True)  # name
        pwd = Column(String(25), nullable=False)  # pwd
        money = Column(Integer, nullable=True)  # 金币
        status = Column(Integer, nullable=False)  # 账号状态(1:正常,0:封禁,2:审核)
    
    class VIPInfo(Base):
        # VIP信息
        __tablename__ = 'vip_info'  # 表名
        id = Column(Integer, primary_key=True)  # id
        info = Column(String(256))  # 备注
        fk_vip_info_on_vip = Column(Integer, ForeignKey('vip.id'))  # 关联外键VIP.id(多对一)(这里的VIP是tablename不是class名)
        VIP = relationship('VIP', backref=backref('VIP_Info'))  # 设置关联使VIPInfo能查询到VIP, 注意这里的字段名在序列化组件的跨表时有用

    注意,设置多对一的时候,只设置ForeignKey只能从 VIP 查询到 VIPInfo,必须要设置 relationship 才可以反向查询(从VIP查询到VIPInfo)

    一对一

    一对一与多对一差不多,如果想要一对一,只需要在原有 多对一 的 多 字段设置 unique(唯一)即可

    我们把之前的代码改成一对一

    class VIP(Base):
        # VIP用户
        __tablename__ = 'vip'  # 表名
        id = Column(Integer, primary_key=True)  # id
        name = Column(String(12), nullable=False, index=True, unique=True)  # name
        pwd = Column(String(25), nullable=False)  # pwd
        money = Column(Integer, nullable=True)  # 金币
        status = Column(Integer, nullable=False)  # 账号状态(1:正常,0:封禁,2:审核)
    
    class VIPInfo(Base):
        # VIP信息
        __tablename__ = 'vip_info'  # 表名
        id = Column(Integer, primary_key=True)  # id
        info = Column(String(256))  # 备注
        fk_vip_info_on_vip = Column(Integer, ForeignKey('vip.id'), unique=True, index=True)  # 关联外键VIP.id(多对一)
        VIP = relationship('VIP', backref=backref('VIP_Info', uselist=False))  # 设置关联使VIPInfo能查询到VIP, 注意这里的字段名在序列化组件的跨表时有用

    需要值得注意的是 relationship 多了 uselist=False

    这个参数是控制查询范围的,如果是一对一我们常把 uselist 设为 False

     默认是 True 的, 举个例子,当我们从 VIP表关联到 VIPInfo表时,如果 uselist为True,那么他会找到对应关联的所有VIPInfo 反之指找一个就结束.所以一对一时我们直接写 False 因为我们知道只有一个对应

    第三章我们会介绍如何在 Flask中使用 SQLAlchemy

  • 相关阅读:
    PVE6.3去订阅
    帝国CMS灵动标签当天更新的日期显示红色其他颜色变成灰色
    灵动标签实现循环子栏目数据——实现 循环子栏目数据标签 (listsonclass)的效果
    帝国cms灵动标签实现循环子栏目数据
    帝国cms常用灵动标签
    51nod1847 奇怪的数学题
    CTS2019 氪金手游
    CTS2019 重复
    UR #5 怎样跑得更快
    AGC034 F
  • 原文地址:https://www.cnblogs.com/chnmig/p/10457534.html
Copyright © 2020-2023  润新知