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

  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/chnmig/p/10457534.html
Copyright © 2011-2022 走看看