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

原文地址:https://www.cnblogs.com/chnmig/p/10457534.html