欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

flask的orm框架SQLAlchemy查詢實(shí)現(xiàn)解析

 更新時(shí)間:2019年12月12日 14:47:24   作者:苦瓜爆炒牛肉  
這篇文章主要介紹了flask的orm框架SQLAlchemy查詢實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了flask的orm框架SQLAlchemy查詢實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一對(duì)多,多對(duì)多是什么?

一對(duì)多。例如,班級(jí)與學(xué)生,一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生,或者多個(gè)學(xué)生對(duì)應(yīng)一個(gè)班級(jí)。

多對(duì)多。例如,學(xué)生與課程,可以有多個(gè)學(xué)生修同一門課,同時(shí),一門課也有很多學(xué)生。

一對(duì)多查詢

如果一個(gè)項(xiàng)目,有兩張表。分別是班級(jí)表,學(xué)生表。

在設(shè)計(jì)數(shù)據(jù)表時(shí),我們給學(xué)生表設(shè)置一個(gè)外鍵,指向班級(jí)表的 id 。

sqlalchemy 模板創(chuàng)建表的代碼:

from flask import Flask, render_template, request, flash, redirect
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__,static_folder="static",template_folder="templates")

# 設(shè)置數(shù)據(jù)庫(kù)連接屬性
app.config['SQLALCHEMY_DATABASE_URI'] = '×××'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 實(shí)例化 ORM 操作對(duì)象
db = SQLAlchemy(app)

# 班級(jí)表
class Classes(db.Model):
  __tablename__ = "classes"
  id = db.Column(db.Integer,primary_key=True)
  name = db.Column(db.String(20),nullable=False,unique=True)

# 學(xué)生表
class Students(db.Model):
  __tablename__ = "students"
  id = db.Column(db.Integer,primary_key=True)
  name = db.Column(db.String(40),nullable=False)
  cls_id = db.Column(db.Integer,db.ForeignKey("classes.id"))  # 注意要寫成(表名.字段名)

創(chuàng)建完表,插入完數(shù)據(jù)后。

如果我們知道學(xué)生的學(xué)號(hào),要查學(xué)生班級(jí)的名稱,應(yīng)該怎么操作呢?

現(xiàn)在可以用一種比較麻煩的方達(dá)查詢:

cls_id = Students.query.filter(Student.id == 'xxx').first()
cls = Classes.query.filter(Classes.id == cls.id).first()
print(cls.name)

這樣的方法太麻煩了,有沒(méi)有簡(jiǎn)單的辦法?

上面創(chuàng)建表的代碼,在18行可以插入一條語(yǔ)句。

relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')

其中realtionship描述了Students和Classes的關(guān)系。在此文中,第一個(gè)參數(shù)為對(duì)應(yīng)參照的類"Students"

第二個(gè)參數(shù)backref為類Students申明新屬性的方法

第三個(gè)參數(shù)lazy決定了什么時(shí)候SQLALchemy從數(shù)據(jù)庫(kù)中加載數(shù)據(jù)

如果設(shè)置為子查詢方式(subquery),則會(huì)在加載完Classes對(duì)象后,就立即加載與其關(guān)聯(lián)的對(duì)象,這樣會(huì)讓總查詢數(shù)量減少,但如果返回的條目數(shù)量很多,就會(huì)比較慢

另外,也可以設(shè)置為動(dòng)態(tài)方式(dynamic),這樣關(guān)聯(lián)對(duì)象會(huì)在被使用的時(shí)候再進(jìn)行加載,并且在返回前進(jìn)行過(guò)濾,如果返回的對(duì)象數(shù)很多,或者未來(lái)會(huì)變得很多,那最好采用這種方式
如果一大堆理論看不明白,那么知道怎么用就可以了。

如果知道學(xué)生的姓名,想知道班級(jí)的名稱,可以這樣查:

stu = Students.query.filter(Students.name == 'xxx').first()
stu.relate_class.name # stu.relate_class 會(huì)跳到 classes 表

如果知道班級(jí)的名稱,想返回全部學(xué)生的名字的列表,可以這樣查:

cls = Classes.query.filter(Classes.name == 'xxx').first()
cls.relate_student.name # cls.relate_stu 會(huì)跳到 students 表

可以使用這樣的方法,有兩個(gè)要求,第一是要設(shè)置外鍵,第二是這句語(yǔ)句:

relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')

注意,什么時(shí)候用 relate_student ,什么時(shí)候用 relate_class 。以及 relationship 這條語(yǔ)句的書寫,要清楚!

多對(duì)多查詢

假設(shè)一堆學(xué)生選了不同的課程,這就是多對(duì)多關(guān)系。

tb_student_course = db.Table('tb_student_course',
               db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
               db.Column('course_id', db.Integer, db.ForeignKey('courses.id'))
               )


class Student(db.Model):
  __tablename__ = "students"
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(64), unique=True)
   # 關(guān)聯(lián)屬性,多對(duì)多的情況,可以寫在任意一個(gè)模型類中
  relate_courses = db.relationship('Course', secondary=tb_student_course,
               backref='relate_student',
               lazy='dynamic')

class Course(db.Model):
  __tablename__ = "courses"
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(64), unique=True)

添加測(cè)試數(shù)據(jù):

# 添加測(cè)試數(shù)據(jù)

  stu1 = Student(name='張三')
  stu2 = Student(name='李四')
  stu3 = Student(name='王五')

  cou1 = Course(name='物理')
  cou2 = Course(name='化學(xué)')
  cou3 = Course(name='生物')

  stu1.courses = [cou2, cou3]  # 記得要添加關(guān)系
  stu2.courses = [cou2]
  stu3.courses = [cou1, cou2, cou3]

  db.session.add_all([stu1, stu2, stu2])
  db.session.add_all([cou1, cou2, cou3])

  db.session.commit()

要查某個(gè)學(xué)生修的全部課程,修了某個(gè)課程的全部學(xué)生:

for course in stu1.relate_courses:
  print(course.name)
for student in cou2.relate_student:
  print(student)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pytorch環(huán)境搭建與基本語(yǔ)法

    Pytorch環(huán)境搭建與基本語(yǔ)法

    這篇文章主要介紹了Pytorch環(huán)境搭建與基本語(yǔ)法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python matplotlib.pyplot.plot()參數(shù)用法

    python matplotlib.pyplot.plot()參數(shù)用法

    這篇文章主要介紹了python matplotlib.pyplot.plot()參數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python從list列表中選出一個(gè)數(shù)和其對(duì)應(yīng)的坐標(biāo)方法

    python從list列表中選出一個(gè)數(shù)和其對(duì)應(yīng)的坐標(biāo)方法

    今天小編就為大家分享一篇python從list列表中選出一個(gè)數(shù)和其對(duì)應(yīng)的坐標(biāo)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • django實(shí)現(xiàn)悲觀鎖樂(lè)觀鎖的項(xiàng)目實(shí)踐

    django實(shí)現(xiàn)悲觀鎖樂(lè)觀鎖的項(xiàng)目實(shí)踐

    在Django中,我們可以通過(guò)實(shí)現(xiàn)悲觀鎖和樂(lè)觀鎖來(lái)保證數(shù)據(jù)的安全性,本文就來(lái)介紹一下django實(shí)現(xiàn)悲觀鎖樂(lè)觀鎖的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2023-08-08
  • python同時(shí)替換多個(gè)字符串方法示例

    python同時(shí)替換多個(gè)字符串方法示例

    這篇文章主要介紹了python同時(shí)替換多個(gè)字符串方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于Python自動(dòng)化操作Excel

    關(guān)于Python自動(dòng)化操作Excel

    這篇文章主要介紹了關(guān)于Python自動(dòng)化操作Excel, Python 是一種功能強(qiáng)大的編程語(yǔ)言,可以用于許多任務(wù),包括處理 Excel 文件,需要的朋友可以參考下
    2023-04-04
  • Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問(wèn)題

    Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問(wèn)題

    這篇文章主要介紹了Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python計(jì)算日期之間的放假日期

    python計(jì)算日期之間的放假日期

    這篇文章主要為大家詳細(xì)介紹了python計(jì)算日期之間的放假日期,實(shí)現(xiàn)自動(dòng)查詢節(jié)日,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 對(duì)numpy中二進(jìn)制格式的數(shù)據(jù)存儲(chǔ)與讀取方法詳解

    對(duì)numpy中二進(jìn)制格式的數(shù)據(jù)存儲(chǔ)與讀取方法詳解

    今天小編就為大家分享一篇對(duì)numpy中二進(jìn)制格式的數(shù)據(jù)存儲(chǔ)與讀取方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python之NAN和INF值處理方式

    python之NAN和INF值處理方式

    這篇文章主要介紹了python之NAN和INF值處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論