flask連線mysql資料庫的一對一,一對多,多對多的處理關係。
阿新 • • 發佈:2018-11-09
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
個人小結,定有不足,歡迎指點。
謝謝~