flask的orm框架SQLAlchemy查詢實現(xiàn)-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)flask的orm框架SQLAlchemy查詢實現(xiàn),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供太倉企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、做網(wǎng)站、成都h5網(wǎng)站建設、小程序制作等業(yè)務。10年已為太倉眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設計公司優(yōu)惠進行中。

一對多,多對多是什么?

一對多。例如,班級與學生,一個班級對應多個學生,或者多個學生對應一個班級。

多對多。例如,學生與課程,可以有多個學生修同一門課,同時,一門課也有很多學生。

一對多查詢

如果一個項目,有兩張表。分別是班級表,學生表。

在設計數(shù)據(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ù)據(jù)庫連接屬性
app.config['SQLALCHEMY_DATABASE_URI'] = '×××'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 實例化 ORM 操作對象
db = SQLAlchemy(app)

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

# 學生表
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ù)后。

如果我們知道學生的學號,要查學生班級的名稱,應該怎么操作呢?

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

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

這樣的方法太麻煩了,有沒有簡單的辦法?

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

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

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

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

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

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

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

如果知道學生的姓名,想知道班級的名稱,可以這樣查:

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

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

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

可以使用這樣的方法,有兩個要求,第一是要設置外鍵,第二是這句語句:

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

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

多對多查詢

假設一堆學生選了不同的課程,這就是多對多關(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)屬性,多對多的情況,可以寫在任意一個模型類中
  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)

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

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

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

  cou1 = Course(name='物理')
  cou2 = Course(name='化學')
  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()

要查某個學生修的全部課程,修了某個課程的全部學生:

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

關(guān)于flask的orm框架SQLAlchemy查詢實現(xiàn)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)頁題目:flask的orm框架SQLAlchemy查詢實現(xiàn)-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://m.kartarina.com/article28/ccgocp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、服務器托管虛擬主機外貿(mào)網(wǎng)站建設、靜態(tài)網(wǎng)站、App設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
主站蜘蛛池模板: 国内精品人妻无码久久久影院导航| 无码人妻品一区二区三区精99| 无码人妻丰满熟妇区五十路百度| 亚洲va无码手机在线电影| 久久精品国产亚洲AV无码娇色| 精品亚洲av无码一区二区柚蜜| 亚洲日韩av无码| 黑人巨大无码中文字幕无码| 自慰无码一区二区三区| 中文字幕亚洲精品无码| 亚洲色中文字幕无码AV| 国产莉萝无码AV在线播放| 亚洲AV无码乱码在线观看裸奔| 久久天堂av综合色无码专区| 亚洲第一极品精品无码久久| 国产综合无码一区二区色蜜蜜| 色窝窝无码一区二区三区| 中文字幕无码av激情不卡久久| 亚洲午夜无码久久久久小说| 无码精品人妻一区二区三区免费看| 国产精品无码久久av| 亚洲精品无码久久久久YW| 久久精品无码精品免费专区| 中文无码久久精品| 亚洲精品人成无码中文毛片 | 亚洲av永久无码精品网站| 波多野结衣VA无码中文字幕电影| 亚洲国产a∨无码中文777| 亚洲精品无码久久久久去q| 无码人妻精品一区二区蜜桃百度| 久久国产精品成人无码网站| 亚洲国产精品无码av| 国产激情无码一区二区app| 中文字幕无码av激情不卡久久| 久久久久亚洲?V成人无码| 西西4444www大胆无码| 特黄熟妇丰满人妻无码| 亚洲AV中文无码乱人伦| 特级无码毛片免费视频| 国产AV无码专区亚洲AV手机麻豆| 亚洲精品无码久久久影院相关影片|