Y18
以学生表与班级表为例,进行一对一,与一对多操作说明。
简单部署:
1、创建flask文件夹,在文件夹中创建python文件,命名为app,其中代码:
from flask import Flask
app = Flask(__name__)
2、引入封装过的连接mysql数据库的操作文件,db_operate.py(Y17已介绍)
3、创建__init__文件为启动文件。代码为:
from flask.app import app
if __name__ == '__main__':
app.run(debug=False)
一、一对一,假设学生与班级的关系是一对一,以下:
1、创建一对一模型文件models_oto.py,相关代码以及操作如下:
# 引入操作封装文件中的类方法和db数据库
from flask.db_operate import DBO,db
# 创建班级模型
class Grade(db.Model, DBO):
g_id = db.Column(db.Integer, primary_key=True)
g_name = db.Column(db.String(30), nullable=False, unique=True)
g_num = db.Column(db.Integer, default=0)
# 一对一关系写法
stus = db.relationship('Student', backref='gd', uselist=False)
__tablename__ = 'grade'
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
# 创建学生模型
class Student(db.Model, DBO):
s_id = db.Column(db.Integer, primary_key=True)
s_name = db.Column(db.String(30), nullable=False)
s_age = db.Column(db.Integer)
s_sex = db.Column(db.String(10), nullable=False)
s_gid = db.Column(db.Integer, db.ForeignKey('grade.g_id'))
__tablename__ = 'stu'
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
# 创建account对象
db.create_all()
stu1 = Student(s_id=101, s_name='y1', s_sex='男' , s_age=25)
stu2 = Student(s_id=108, s_name='y2', s_sex='女' , s_age=27)
stu3 = Student(s_id=110, s_name='y3', s_sex='男' , s_age=30)
# 正常添加
# grade1 = Grade(g_id=1, g_name='py1', g_num=10)
# grade1.stus = stu1
# db.session.add(grade1)
# db.session.commit()
# 封装添加
# grade1 = Grade.add(g_id=2, g_name='py2', g_num=27,stus = stu2)
# 修改学生信息
# 1. 无联系修改
# students = Student.query.get(100).update(s_age=77)
# 2. 通过联系修改
# grade1 = Grade.query.get(2)
# students = grade1.stus.update(s_age=29)
# grade1.update(g_num=100)
# 删除
# grade1 = Grade.query.get(1)
# studs = grade1.stus.delete()
# grade1.delete()
# 通过子表访问主表
# stu = Student.query.get(108)
# print(stu.gd.g_name)
2、在__init__中导入模型文件,如下。注释部分,测试哪段解封哪段即可,之后运行__init__文件,根据所需测试。
import flask.models_oto
二、一对多,学生与班级的关系是多对一,以下:
1、创建一对多模型文件models_otm.py,相关代码以及操作如下:
from flask.db_operate import DBO,db
class Grade(db.Model, DBO):
g_id = db.Column(db.Integer, primary_key=True)
g_name = db.Column(db.String(30), nullable=False, unique=True)
g_num = db.Column(db.Integer, default=0)
# relationship():在主表中提前声明存在关系的两个类,backref设置的是子表操作主表数据时依据的字段,stus:代表主表操作子表中数据时依据的字段。lazy:设置当前数据的加载方式为懒加载
# 一对多写法
stus = db.relationship('Student', backref='gd', lazy='dynamic')
__tablename__ = 'grade'
def __init__(self, **kwargs):
# self.g_id = kwargs.get('g_id')
for key, value in kwargs.items():
setattr(self, key, value)
class Student(db.Model, DBO):
s_id = db.Column(db.Integer, primary_key=True)
s_name = db.Column(db.String(30), nullable=False)
s_age = db.Column(db.Integer)
s_sex = db.Column(db.String(10), nullable=False)
s_gid = db.Column(db.Integer, db.ForeignKey('grade.g_id'))
__tablename__ = 'stu'
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
# 创建account对象
db.create_all()
stu1 = Student(s_id=107, s_name='y1', s_sex='男' , s_age=25)
stu2 = Student(s_id=108, s_name='y2', s_sex='女' , s_age=27)
stu3 = Student(s_id=109, s_name='y3', s_sex='男' , s_age=30)
# 正常添加
# grade1 = Grade(g_id=1, g_name='py1', g_num=17)
# grade1.stus = [stu1,stu2,stu3]
# db.session.add(grade1)
# db.session.commit()
# 封装添加
# grade1 = Grade.add(g_id=2, g_name='py3', g_num=27,stus = [stu1,stu2,stu3])
# 相同班级添加学生(更新数据)
# grade1 = Grade.query.get(1)
# students = grade1.stus.all()
# for stu in [stu1,stu2,stu3]:
# students.append(stu)
# grade1.update(stus = students, g_num=6)
# 删除
# grade1 = Grade.query.get(2)
# studs = grade1.stus.all()
# for stu in studs:
# stu.delete()
# grade1.delete()
# 通过子表访问主表
# stu = Student.query.get(104)
# print(stu.gd.g_name)
2、在__init__中导入模型文件,如下。注释部分,测试哪段解封哪段即可,之后运行__init__文件,根据所需测试。
import flask.models_otm
三、多对多,学生与课程的关系是多对多,以下:
1、flask中,多对多关系的创建必须通过一个中间表连接两个表(中间表只有两列且都为外键,外键分别为连接两个表中的主键。中间表不进行任何操作,仅提供联系用途),创建多对多模型文件models_mtm.py,相关代码以及操作如下:
from flask5.db_operate import db, DBO
# 创建多对多关系的中间表
sm_relation = db.Table(
'sm_relation', # 表格名称
db.Column('ss_id', db.Integer, db.ForeignKey('student.s_id')), # 第一列数据设置
db.Column('mm_id', db.Integer, db.ForeignKey('major.m_id'))
)
# 创建学生模型
class Student(db.Model, DBO):
__tablename__ ='student'
s_id = db.Column(db.Integer, primary_key=True)
s_name = db.Column(db.String(77), nullable=False)
s_age = db.Column(db.Integer, nullable=False)
s_sex = db.Column(db.String(7), nullable=False)
majors = db.relationship('Major', backref='stus', lazy='dynamic',secondary=sm_relation) #secondary用来设置多对多关系中的第三个表格对象
# 创建课程模型
class Major(db.Model, DBO):
__tablename__ ='major'
m_id = db.Column(db.Integer, primary_key=True)
m_name = db.Column(db.String(77), nullable=False)
m_score = db.Column(db.Float,nullable=False)
# 创建表格对象
db.create_all()
# 添加若干科目信息
# Major.add([
# {'m_id':1, 'm_name':'高等数学', 'm_score':5},
# {'m_id':2, 'm_name':'概率论', 'm_score':3},
# {'m_id':3, 'm_name':'大学英语', 'm_score':3},
# {'m_id':4, 'm_name':'马克思主义', 'm_score':7},
# {'m_id':5, 'm_name':'数据结构', 'm_score':6},
# ])
# 定义学生对象,模拟选课操作
# Student.add([
# {'s_id':100, 's_name':'小一', 's_age':7, 's_sex':'男'},
# {'s_id':101, 's_name':'小二', 's_age':17, 's_sex':'男'},
# {'s_id':102, 's_name':'小三', 's_age':27, 's_sex':'女'},
# ])
# # 模拟选课(添加多对多数据往在第三个中间表中)
# majors = ['高等数学','概率论','大学英语']
# # 查询对应课程的对象
# major_list = []
# for name in majors:
# major = Major.query.filter(Major.m_name == name).first()
# major_list.append(major)
# # 将X学生选择的课程绑定给X学生
# Student.query.get(101).update(majors=major_list)
# 根据学生查询对应的科目
# stu = Student.query.get(100)
# stu_m = stu.majors.all()
# # print(stu_m)
# for s_major in stu_m:
# print(s_major.m_name)
# 根据科目查询对应的学生
# major = Major.query.get(1)
# major_s = major.stus
# # print(major_s)
# for m_stus in major_s:
# print(m_stus.s_name)
2、在__init__中导入模型文件,如下。注释部分,测试哪段解封哪段即可,之后运行__init__文件,根据所需测试。
import flask.models_mtm
源代码链接:(flask4为一对一,一对多。 flask5为多对多)
https://pan.baidu.com/s/10_vZeB9cB-ZiftsVhie3NQ 提取码:33nq
个人小结,定有不足,欢迎指点。
谢谢~
扫描二维码关注公众号,回复:
3642867 查看本文章