1. 程式人生 > >flask連線mysql資料庫的一對一,一對多,多對多的處理關係。

flask連線mysql資料庫的一對一,一對多,多對多的處理關係。

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


個人小結,定有不足,歡迎指點。
謝謝~