1.SQLAlchemy表关系
在MySQL中表关系有一对一、一对多和多对多,我们接下来通过SQLAlchemy实现上述表关系。
1.1.一对多
在MySQL中构建表与表之间的关系是通过设置外键来完成的,外键可以使得两张表关联,保证数据的一致性和实现一些级联操作。同样,我们需要通过SQLAlchemy设置外键来实现表关系。
现在我们在数据库中建立一张student表,表中有id字段(数值型、主键、自增),name字段(字符串类型)、age字段(字符串类型)、sex字段(枚举型,“男”和“女”);我们再建立一张score表,表中有num字段(表示序号、数值型、主键、自增)、name字段(字符型)、id(外键,对应student表中的id字段、数值型)、score字段(数值型)。student表中的一条记录可以对应score表中的多条记录。因此,父模型为student表,子模型为score表。
代码如下,
from sqlalchemy import create_engine, Column, String, Integer, Enum, ForeignKey
# 注意要导入ForeignKey模块
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship # 注意要导入relationship模块
HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'sqlalchemy'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) # ?charset=utf8mb4表示设置字符集类型为utf8mb4
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class Student(Base):
__tablename__ = 'student'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(10))
age = Column(Integer)
sex = Column(Enum('男', '女'))
def __repr__(self):
return "Student(name:{}, age:{}, sex:{})".format(self.name, self.age, self.sex)
class Score(Base):
__tablename__ = 'score'
num = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(10))
id = Column(Integer, ForeignKey('student.id'))
# 设置外键,该外键对应student表id字段,一般格式为 表名.字段
score = Column(Integer)
student = relationship('Student', backref='score')
# 设置relationship,第一个参数为指向的ORM模型,backref参数可以指定反向访问的属性名称
def __repr__(self):
return "Score(name:{}, id:{}, score:{})".format(self.name, self.id, self.score)
Base.metadata.drop_all()
Base.metadata.create_all()
注意,
1.mysql级别的外键,必须拿到一个表的外键,然后通过这个外键再去另外一张表中查找,这样太麻烦了。SQLAlchemy提供了一个relationship,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到了。
2.外键的字段,必须和父表的主键字段类型保持一致。
下面,我们向表中添加数据,
student1 = Student(name='zhao', age=22, sex='男')
student2 = Student(name='qian', age=20, sex='男')
student3 = Student(name='sun', age=23, sex='女')
student4 = Student(name='li', age=21, sex='男')
score1 = Score(name='zhao', score=87)
score2 = Score