【SQLAlchemy】第6节:模型类1对1

【SQLAlchemy】第6节:模型类1对1

1 思路与实现

1对1的应用场景并不多,介绍一下我熟悉的两种业务场景:

  1. 一张表中以少部分字段并不常用,而且这些不常用的字段占用的存储空间还很大,这时候就可以把1个表一分为二,1对1关联
  2. 一张表中有些数据十分敏感,可以把敏感的数据分离出来,1对1连接

以下代码以CSDN学院的某个业务为例:

  • 注册CSDN账号,相当于添加了一个User
  • 每个User即每个用户都可以申请成为讲师,那么讲师和用户表就是一个1对1的关系
  • 只有极少数的用户注册成为讲师,所以讲师这个数据并不经常访问,而且还涉及到讲师对应的课程,学员的评价,课程的价格等等,所以讲师关联的数据比较大,符合上面的第一种特点,所以把User和Teacher分开
from sqlalchemy import create_engine
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(
    'mysql+pymysql://root:12345@localhost:3306/db_sqlalchemy_notebook',
    echo=False
)

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String(16), nullable=False)
    teacher_id = Column(Integer,ForeignKey('teacher.id'))
    teacher = relationship(
        'Teacher',
        backref = backref('user',uselist=False), # 如果不加userlist user.teacher返回的对象类型是list,但我们是1对1的关系,返回一个Teacher对象就可以了
        uselist = False, # 相同的道理,让teacher.user的返回值是一个User对象,而不是list
    )


class Teacher(Base):
    __tablename__ = 'teacher'

    id = Column(Integer, primary_key=True)
    name = Column(String(16), nullable=False)

2 总结

1对1关系定义的时候,加入uselist关键字,可以调整返回值不是list,而且单个的模型类对象,使得

  • user.teacher --> User对象
  • teacher.user --> Teacher对象

猜你喜欢

转载自blog.csdn.net/kzl_knight/article/details/103109241