1 思路与实现
1对1的应用场景并不多,介绍一下我熟悉的两种业务场景:
- 一张表中以少部分字段并不常用,而且这些不常用的字段占用的存储空间还很大,这时候就可以把1个表一分为二,1对1关联
- 一张表中有些数据十分敏感,可以把敏感的数据分离出来,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对象