flask的進階使用方法

【 一 】一對多關系

# 1 一對一   [本質就是一對多--》多的那個唯一]
# 2 一對多
# 3 多對多

1.1 關系

####  一對多關系
class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True)caption = Column(String(50), default='籃球')def __str__(self):return self.captionclass Person(Base):__tablename__ = 'person'nid = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=True)# hobby指的是tablename而不是類名hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 一個愛好,可以被多個人喜歡,一個人只能喜歡一個愛好# 跟數據庫無關,不會新增字段,只用于快速鏈表操作# 類名,backref用于反向查詢hobby = relationship('Hobby', backref='pers')def __str__(self):return self.namedef __repr__(self):return self.name
from models import Person,Hobby
# 第一步:創建engine
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy001?charset=utf8",max_overflow=0,  # 超過連接池大小外最多創建的連接pool_size=5,  # 連接池大小pool_timeout=30,  # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1  # 多久之后對線程池中的線程進行一次連接的回收(重置)
)# 第二步:創建 session對象---老方式
from sqlalchemy.orm import Session
session=Session(engine)if __name__ == '__main__':### 笨辦法增加#1 先增加一個hobby# hobby=Hobby()# session.add(hobby)# session.commit()#2 增加Person---》必須要有hobby_id# person=Person(name='lqz',hobby_id=1)# session.add(person)# session.commit()### 簡便方法--》增加person的同時,增加了Hobby# person = Person(name='lqz', hobby=Hobby(caption='乒乓球'))# session.add(person)# session.commit()# hobby=session.query(Hobby).filter_by(id=1).first()# person = Person(name='lqz3', hobby=hobby)# session.add(person)# session.commit()# 基于對象的跨表查詢--->正向# person=session.query(Person).filter_by(nid=2).first()# print(person)# print(person.hobby_id)# print(person.hobby)# 基于對象的跨表查詢--->反向hobby = session.query(Hobby).filter_by(id=1).first()print(hobby.caption)print(hobby.pers)

models.py

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
import datetime# 新版本創建基類
# 第一步:創建基類,以后所有類,都必須繼承基類
from sqlalchemy.orm import DeclarativeBase, relationshipclass Base(DeclarativeBase):pass### 第二步:寫個類,繼承
### 第三步:寫字段:傳統方式,類型方式class User(Base):__tablename__ = 'user'id = Column(Integer, primary_key=True, autoincrement=True)# name列varchar32,索引,不可為空 nullable=Falsename = Column(String(32), index=True, nullable=False)# email 列,varchar32,唯一email = Column(String(32), unique=True)ctime = Column(DateTime, default=datetime.datetime.now)extra = Column(Text, nullable=True)def __repr__(self):return f"<User(name={self.name}, email={self.email})>"####  一對多關系
class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True)caption = Column(String(50), default='籃球')def __str__(self):return self.captionclass Person(Base):__tablename__ = 'person'nid = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=True)# hobby指的是tablename而不是類名hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 一個愛好,可以被多個人喜歡,一個人只能喜歡一個愛好# 跟數據庫無關,不會新增字段,只用于快速鏈表操作# 類名,backref用于反向查詢hobby = relationship('Hobby', backref='pers')def __str__(self):return self.namedef __repr__(self):return self.nameif __name__ == '__main__':from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",max_overflow=0,  # 超過連接池大小外最多創建的連接pool_size=5,  # 連接池大小pool_timeout=30,  # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1  # 多久之后對線程池中的線程進行一次連接的回收(重置))# 第四步 創建user表Base.metadata.create_all(engine)## 第五步:刪除表# Base.metadata.drop_all(engine)
from models import Person, Hobby# 第一步:創建engine
from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",max_overflow=0,  # 超過連接池大小外最多創建的連接pool_size=5,  # 連接池大小pool_timeout=30,  # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1  # 多久之后對線程池中的線程進行一次連接的回收(重置)
)# 第二步 創建 session對象---老方式
from sqlalchemy.orm import Sessionsession = Session(engine)# # 增加一個hobby
res1 = Hobby(caption='rapper')
session.add(res1)# # person ---->>> 必須要有hobby_id
person = Person(name='jingyi', hobby_id=1)
session.add(person)
session.commit()
session.close()## 簡便方法--》增加person的同時,增加了Hobby
person = Person(name='jingyi', hobby=Hobby(caption='乒乓球'))
session.add(person)
session.commit()
hobby=session.query(Hobby).filter_by(id=1).first()
person = Person(name='jing', hobby=hobby)
session.add(person)
session.commit()# 基于對象的跨表查詢--->正向
person = session.query(Person).filter_by(nid=1).first()
print(person)
print(person.hobby_id)
print(person.hobby)# 基于對象的跨表查詢--->反向
hobby = session.query(Hobby).filter_by(id=1).first()
print(hobby.caption)
print(hobby.pers)
  • 基于對象的跨表查詢—>正向

image-20240618172833794

  • 基于對象的跨表查詢—>反向

image-20240618173136759

【 二 】多對多關系

  • modelss.py

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index, Table
import datetime# 新版本創建基類
# 第一步:創建基類,以后所有類,都必須繼承基類
from sqlalchemy.orm import DeclarativeBase, relationshipclass Base(DeclarativeBase):pass### 第二步:寫個類,繼承
### 第三步:寫字段:傳統方式,類型方式# 定義關聯表 多對多必備可少的參數
association_table = Table('user1_group_association', Base.metadata,Column('user1_id', Integer, ForeignKey('user1.id')),Column('group_id', Integer, ForeignKey('group.id')),UniqueConstraint('user1_id', 'group_id')  # 如果需要的話,可以添加唯一約束)# 定義 User1 模型
class User1(Base):__tablename__ = 'user1'id = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=False)groups = relationship("Group", secondary=association_table, backref="users")# 定義 Group 模型
class Group(Base):__tablename__ = 'group'id = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=False)if __name__ == '__main__':from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",max_overflow=0,  # 超過連接池大小外最多創建的連接pool_size=5,  # 連接池大小pool_timeout=30,  # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1  # 多久之后對線程池中的線程進行一次連接的回收(重置))# 第四步 創建user表Base.metadata.create_all(engine)## 第五步:刪除表# Base.metadata.drop_all(engine)
  • py

  • 增加

from modelss import User1, Group# 第一步:創建engine
from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",max_overflow=0,  # 超過連接池大小外最多創建的連接pool_size=5,  # 連接池大小pool_timeout=30,  # 池中沒有線程最多等待的時間,否則報錯pool_recycle=-1  # 多久之后對線程池中的線程進行一次連接的回收(重置)
)# 第二步 創建 session對象---老方式
from sqlalchemy.orm import Sessionsession = Session(engine)
# # 增加一個group
group1 = Group(name='5A風景區')
group2 = Group(name='大清敗家子慈溪')# session.add_all([group1, group2])
# # 增加一個User1
res1 = User1(name='劉亦菲')
res2 = User1(name='趙敏')res1.groups.append(group1)
res2.groups.append(group2)
session.add_all([res1,res2])# 基于對象的跨表查--》正向user = session.query(User1).filter(User1.id == 3).all()[0]
print(user.name)
print(user.groups)session.commit()
session.close()

image-20240618190135414

# 基于對象的跨表查--》正向user = session.query(User1).filter(User1.id == 2).all()[0]
print(user.name)
print(user.groups)group = session.query(Group).filter(Group.id == 3).all()[0]
print(group.name)
print(group.users)
  • # 基于對象的跨表查–》正向

image-20240618191810231

  • 如果user1表中的字段沒有關系可以

user1 = session.query(User1).filter_by(id=2).first()
if user1 is None:print("用戶不存在")
else:# 假設你想要關聯一個已經存在的組,其id為group_idgroup_id = 2 # 這里替換為你想要關聯的組的ID# 查詢該組group_to_add = session.query(Group).filter_by(id=group_id).first()if group_to_add is None:print("組不存在")else:# 將組添加到用戶的groups列表中user1.groups.append(group_to_add)# 提交事務以保存更改session.commit()print("關聯已添加")# 關閉sessionsession.close()

image-20240618191320318

filter[where]查詢 寫條件

# #filter[where]查詢  寫條件
user1 = session.query(User1).where(User1.id >= 2)
# SELECT user1.id AS user1_id, user1.name AS user1_name
# FROM user1
# WHERE user1.id >= %(id_1)s
user2 = session.query(User1).where(User1.id >= 2).all()
#filter[where]查詢  寫條件
user3 = session.query(User1).filter(User1.id >= 2).all()
# [小昭, 劉亦菲, 趙敏, 小玲, 小妹]
group1 = session.query(Group).filter_by(name='5A風景區').first()
# 5A風景區
print(user1)
print(user2)
print(user3)
print(group1)

image-20240618193530312

between

## 3 betweenres = session.query(User1).where(User1.id.between(1,7),User1.name == '劉亦菲').all()print(res)
# 這個就代表有兩個復合條件
# [劉亦菲, 劉亦菲]

image-20240618193929854

in

## 4 in
res = session.query(User1).filter(User1.id.in_([1,2,7])).all()
print(res)
# [李保平, 小昭, 劉亦菲]

image-20240618194126190

~非,除。。外

# 5 ~非,除。。外
res = session.query(User1).filter(~User1.id.in_([3, 4]),User1.name=='劉亦菲').all()
print(res)
# 原本是有兩個劉亦菲的因為我用了~User1.id.in_([3, 4] 中的3 就是一個劉亦菲
# [劉亦菲]

二次篩選

session.query(User1).filter(User1.id.in_(session.query(Group.id).filter_by(name='劉亦菲'))).all()

and,or條件

# 7 and,or條件
from sqlalchemy import and_, or_
# and_
res1 = session.query(User1).filter(and_(User1.id > 1, User1.name == '劉亦菲')).all()
# or_
res2 = session.query(User1).filter(or_(User1.id >= 3, User1.name == '劉亦菲')).all()
print(res1)
# [劉亦菲, 劉亦菲, 劉亦菲]
print(res2)
# [劉亦菲, 劉亦菲, 劉亦菲, 小妹, 小玲, 趙敏]

通配符,以小開頭,不以小開頭

# 8 通配符,以小開頭,不以小開頭
res1 = session.query(User1).filter(User1.name.like('小%')).all()res2 = session.query(User1).filter(~User1.name.like('小%')).all()res3 = session.query(User1).filter(~User1.name.like('小%'))
print(res1)
# [小妹, 小昭, 小玲]
print(res2)
# [劉亦菲, 劉亦菲, 劉亦菲, 趙保平, 趙敏]
print(res3) # 原聲sql語句
# SELECT user1.id AS user1_id, user1.name AS user1_name 
# FROM user1 
# WHERE user1.name NOT LIKE %(name_1)s

限制,用于分頁,區間

# 9 限制,用于分頁,區間
res1 = session.query(User1)[5:9]
res2 = session.query(User1)[0:4]
print(res1)
# [小玲, 趙保平, 趙敏]
print(res2)
# [劉亦菲, 劉亦菲, 劉亦菲, 小妹]

排序

# 10 排序,根據name降序排列(從大到小) desc   asc
res = session.query(User1).order_by(User1.name.asc()).all()
print(res)
# [劉亦菲, 劉亦菲, 劉亦菲, 小妹, 小昭, 小玲, 趙保平, 趙敏]res = session.query(User1).order_by(User1.name.desc(), User1.id.asc()).all()
print(res)
# [趙敏, 趙保平, 小玲, 小昭, 小妹, 劉亦菲, 劉亦菲, 劉亦菲]

分組

# 12 分組      一旦分組后,select 字段必須是 分組字段或聚合函數的字段from sqlalchemy.sql import funcret = session.query(# 按 User1.name 分組,并選擇每個組的最大 ID、ID 總和、最小 ID 和名稱func.max(User1.id).label('max_id'),func.sum(User1.id).label('sum_id'),func.min(User1.id).label('min_id'),User1.name
).group_by(User1.name).all()user1 = session.query(User1).filter(User1.name)
print(user1)
# SELECT user1.id AS user1_id, user1.name AS user1_name
# FROM user1
# WHERE user1.name
# 輸出結果
for row in ret:print(row.max_id, row.sum_id, row.min_id, row.name)

image-20240618204150063

連表查詢

# 連表查詢ret = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id).all()
print(ret)ret1 = session.query(Person).join(Hobby, Person.nid == Hobby.id, isouter=True)
print(ret1)
# SELECT person.nid AS person_nid, person.name AS person_name, person.hobby_id AS person_hobby_id
# FROM person LEFT OUTER JOIN hobby ON person.nid = hobby.id

image-20240618204059136

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40930.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++多態(虛函數,純虛函數,抽象類)

一.多態 1.理解&#xff1a; 多種形態&#xff0c;多種形式 eg:多個派生類均把基類的方法run重新實現&#xff0c;但是實現的方式不同&#xff0c;體現了多種形式&#xff0c;即為多態 2.分類 &#xff08;1&#xff09;編譯時的多態&#xff1a;在編譯過程中確定了同名操…

Java中的代碼優化與重構策略

Java中的代碼優化與重構策略 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 引言 代碼優化與重構在軟件開發中扮演著至關重要的角色。優秀的代碼不僅令人…

將游戲降權運行 2024年,防止游戲檢測,泄漏個人隱私

不得不說&#xff0c;現在的游戲&#xff0c;膽子是真的越來越大了。很多都帶了個啟動器&#xff0c;你開著游戲的時候他就給他開多了1個掃描器&#xff0c;看下你有沒看一些小孩不宜的&#xff0c;玩游戲不宜打開的軟件什么的&#xff0c;包括你的MAC地址啊&#xff0c;你當前…

pydub、ffmpeg 音頻文件聲道選擇轉換、采樣率更改

快速查看音頻通道數和每個通道能力判斷具體哪個通道說話&#xff1b;一般能量大的那個算是說話 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

量化交易:金融投資的新篇章

在金融投資的世界里&#xff0c;量化交易正逐漸成為一股不可忽視的力量。它以數據驅動和算法決策為特點&#xff0c;為投資者提供了一種全新的交易方式。本文將深入探討量化交易的基本概念、優勢、挑戰以及如何開始使用量化交易策略。 量化交易的定義與起源 量化交易&#xf…

Android10以上實現獲取設備序列號功能

Android10以上實現獲取設備唯一標識&#xff0c;目前只支持華為和榮耀設備。實現原理&#xff1a;通過無障礙服務讀取序列號界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

Zoom使用的基本步驟和注意事項

Zoom是一款功能強大的視頻會議軟件&#xff0c;廣泛應用于遠程辦公、在線教育、團隊協作等多個場景。以下是Zoom使用的基本步驟和注意事項&#xff1a; 一、注冊與登錄 注冊Zoom賬戶&#xff1a; 訪問Zoom官方網站&#xff08;如zoom.us&#xff09;&#xff0c;點擊“注冊”…

Android Enable 和clickable

setEnabled 使能控件 設置為false&#xff0c;該控件永遠不會活動&#xff0c;不管設置為什么屬性&#xff0c;都無效&#xff1b; 設置為true&#xff0c;表明激活該控件&#xff0c;控件處于活動狀態&#xff0c;處于活動狀態&#xff0c;就能響應事件了&#xff0c;比如觸摸…

mybatis實現動態sql

第一章、動態SQL MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗&#xff0c;你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格&#xff0c;還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特…

2024北京大健康展,北京健康生活產品展覽會十月舉辦

2024北京健博會&#xff0c;立足北京&#xff0c;效應輻射全國買方市場&#xff0c;助力健康中國事業建設&#xff1b; 2024第11屆中國&#xff08;北京&#xff09;國際大健康產業博覽會 The 2024 China (Beijing) International Health Service Expo 時間&#xff1a;2024年…

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 在收發 RIP 報文時的區別

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 的區別 為了更好地支持實際環境中路由器對 RIP 的支持&#xff0c;華為 VRP 平臺具有一個兼容版本&#xff0c;默認情況下啟動 RIP 進程后&#xff0c;如果沒有配置 RIP 版本&#xff0c;該版本就為兼容版本&#xff0c;對 versio…

[ C++ ] 深入理解模板( 進 階 )

目錄 非類型模板參數 類模板沒有實例化的情況 模板的特化 注意函數特化中遇到的問題 建議&#xff1a;&#xff08;直接使用函數重載&#xff09; 類模板特化 全特化 偏特化 偏特化有以下兩種表現方式&#xff1a; 部分特化&#xff08;將模板參數類表中的一部分參數特化…

vue this.$refs加變量名

想動態獲取$refs&#xff0c;我們可以用模板字符串來動態綁定ref的值。代碼如下&#xff1a; this.$refs[${this.treeQueFlag}].setCheckedNodes([]); $refs后面拼變量&#xff0c;vue動態給$refs賦值_vue ref動態賦值-CSDN博客

旅游系統(附管理端+前臺)PHP源碼

一. 前言 今天小編給大家帶來了一款可學習&#xff0c;可商用的&#xff0c;旅游系統 源碼&#xff0c;支持二開&#xff0c;無加密。支持景點管理&#xff0c;登錄&#xff0c;景點預定&#xff0c;意見反饋&#xff0c;統計等功能。詳細界面和功能見下面視頻演示。 二. 視頻…

【flutter問題記錄】 無效的源發行版:17

問題描述 在看開源項目的時候&#xff0c;clone下來后一直編譯失敗&#xff0c;提示&#xff1a;無效的源發行版:17&#xff0c;看描述大概是jdk的版本問題&#xff0c;但是在Android studio各種指定都無用&#xff0c;網上資料也沒有flutter項目的解決方案&#xff0c;最后在…

在Spring MVC框架中,如何處理HTTP請求和響應?

在Spring MVC框架中&#xff0c;HTTP請求和響應的處理是通過一系列組件和流程來完成的。以下是Spring MVC處理HTTP請求和響應的主要步驟&#xff1a; 用戶發起請求&#xff1a; 用戶在客戶端&#xff08;如瀏覽器&#xff09;上發起一個HTTP請求&#xff0c;這個請求被發送到服…

廣州自閉癥機構哪家好?

在廣州&#xff0c;眾多的自閉癥康復機構中&#xff0c;星貝育園自閉癥兒童康復學校以其獨特的優勢脫穎而出。 一、專業的師資團隊 我們擁有一支經驗豐富、專業素養極高的師資隊伍。每位老師都經過嚴格的專業培訓&#xff0c;深入了解自閉癥兒童的特點和需求。他們不僅具…

深入挖掘海外快手kwai ads推廣巴西slots手游廣告獨家優勢

深入挖掘海外快手kwai ads推廣巴西slots手游廣告獨家優勢 在數字化時代&#xff0c;廣告投放已成為各行各業不可或缺的一部分&#xff0c;特別是在游戲行業&#xff0c;如何有效地推廣游戲產品&#xff0c;吸引玩家的眼球&#xff0c;成為了每一個游戲開發商和廣告主所關注的焦…

假設性文檔嵌入 HyDE:大模型 + 對比學習,從關鍵詞相似度搜索到語義搜索

假設性文檔嵌入 HyDE&#xff1a;大模型 對比學習&#xff0c;從關鍵詞相似度搜索到語義搜索 提出背景流程圖解法拆解類比1. 單一文檔嵌入空間的搜索2. 指令跟隨型語言模型&#xff08;InstructLM&#xff09;的引入3. 生成文檔的嵌入編碼 提出背景 論文&#xff1a;https://…