Python web框架fastapi數據庫操作ORM(一)

文章目錄

  • Fastapi ORM操作
    • 1、創建模型
    • 2、創建數據庫連接配置文件
    • 3、啟動項目
    • 4、根據模型類創建數據庫表
      • 1. 初始化配置,只需要使用一次
      • 2. 初始化數據庫,一般情況下只用一次
      • 3. 更新模型并進行遷移
      • 4. 重新執行遷移,寫入數據庫
      • 5. 回到上一個版本
      • 6. 查看歷史遷移記錄
    • 5、選課系統接口開發
      • (1)all查詢,查詢出來的是個list類型數據
      • (2)過濾查詢,查詢指定內容filter,得到的依然是list類型數據
      • (3)get方法,直接查詢
      • (4)模糊查詢,查詢學號大于2001的學生
      • (5)values查詢
      • (6)將數據庫數據顯示到web頁面

Fastapi ORM操作

在大型的web開發中,我們肯定會用到數據庫操作,那么FastAPI也支持數據庫的開發,你可以用 PostgreSQL、MySQL、 SQLite Oracle 等。本文用SQLite為例。我們看下在fastapi是如何操作設計數據庫的。
ORM是“對象-關系-映射”的簡稱。(Object Relational Mapping,簡稱ORM)
fastapi是一個很優秀的框架,但是缺少一個合適的orm,官方代碼里面使用的是sqlalchemy,Tortoise ORM 是受 Django 啟發的易于使用的異步 ORM (對象關系映射器)。
在這里插入圖片描述

Tortoise ORM 目前支持以下[數據庫]

  • PostgreSQL >= 9.4(使用asyncpg)
  • SQLite(使用aiosqlite)
  • MySQL/MariaDB

安裝tortoise
pip install tortoise

安裝數據模型遷移工具
pip install aerich

我用的mysql,因此還需要安裝aiomysql包:
pip install aiomysql

aerich的功能類似于django的migrate。

1、創建模型

以選課系統為例:
創建個模型類文件 models.py

#導入tortoisefrom tortoise.models import Model
from tortoise import fields#創建班級類
class Clas(Model):name = fields.CharField(max_length=255, description='班級名稱')#創建老師類
class Teacher(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=255, description='姓名')tno = fields.IntField(description='賬號')pwd = fields.CharField(max_length=255, description='密碼')#課程表
class Course(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=255, description='課程名')teacher = fields.ForeignKeyField('models.Teacher', related_name='courses', description='課程講師')#創建學生類
class Student(Model):id = fields.IntField(pk=True)sno = fields.IntField(description='學號')#description 在接口文檔有個顯示pwd = fields.CharField(max_length=255, description='密碼')name = fields.CharField(max_length=255, description='姓名')# 一對多,反向查詢時使用related_nameclas = fields.ForeignKeyField('models.Clas', related_name='students')# 多對多courses = fields.ManyToManyField('models.Course', related_name='students',description='學生選課表')

在這里插入圖片描述

2、創建數據庫連接配置文件

創建settings.py 配置文件

TORTOISE_ORM = {'connections': {'default': {# 'engine': 'tortoise.backends.asyncpg',  PostgreSQL'engine': 'tortoise.backends.mysql',  # MySQL or Mariadb'credentials': {'host': '10.10.0.52','port': '3306','user': 'root','password': 'Jingxxxxxxxx','database': 'fastapi','minsize': 1,'maxsize': 5,'charset': 'utf8mb4',"echo": True}},},'apps': {'models': {#這個models就是自己配置的models.py位置'models': ['models'],'default_connection': 'default',}},'use_tz': False,'timezone': 'Asia/Shanghai'
}

3、啟動項目

main.py 啟動項目

from fastapi import FastAPI  # FastAPI 是一個為你的 API 提供了所有功能的 Python 類。
import uvicorn
from tortoise.contrib.fastapi import register_tortoisefrom settings import TORTOISE_ORM#創建應用程序,app是應用程序名
app = FastAPI()  # 這個實例將是創建你所有 API 的主要交互對象。這個 app 同樣在如下命令中被 uvicorn 所引用# 該方法會在fastapi啟動時觸發,內部通過傳遞進去的app對象,監聽服務啟動和終止事件
# 當檢測到啟動事件時,會初始化Tortoise對象,如果generate_schemas為True則還會進行數據庫遷移
# 當檢測到終止事件時,會關閉連接
register_tortoise(app,#數據庫配置信息config=TORTOISE_ORM,# generate_schemas=True,  # 如果數據庫為空,則自動生成對應表單,生產環境不要開# add_exception_handlers=True,  # 生產環境不要開,會泄露調試信息
)if __name__ == '__main__':#注意,run的第一個參數 必須是文件名:應用程序名uvicorn.run("quickstart:app", port=8080,  reload=True, workers=1)

在這里插入圖片描述

啟動沒報錯表示正常連接到了數據庫
在這里插入圖片描述

4、根據模型類創建數據庫表

aerich是一種ORM遷移工具,需要結合tortoise異步orm框架使用。安裝aerich

1. 初始化配置,只需要使用一次

初始化之前,需要在settings.py中將aerich自帶的models也配置上
在這里插入圖片描述

在中高端執行命令

aerich init -t settings.TORTOISE_ORM # TORTOISE_ORM配置的位置)
在這里插入圖片描述

初始化完會在當前目錄生成一個文件:pyproject.toml和一個文件夾:migrations

  • pyproject.toml:保存配置文件路徑,低版本可能是aerich.ini
  • migrations:存放遷移文件

2. 初始化數據庫,一般情況下只用一次

將我們在models.py里面配置的表創建到數據庫中
aerich init-db
在這里插入圖片描述

  1. 此時數據庫中就有相應的表格
  2. 如果TORTOISE_ORM配置文件中的models改了名,則執行這條命令時需要增加--app參數,來指定你修改的名字

查看數據庫,數據庫中就有了我們在模型類里面配置的表
在這里插入圖片描述

看下migrations里面的py文件,就是創建表語句
在這里插入圖片描述

3. 更新模型并進行遷移

我們在創建模型類之后,通常也會修改
修改model類,重新生成遷移文件,比如添加一個字段
我們給course類添加個地址字段
在這里插入圖片描述

aerich migrate [–name] (標記修改操作) # aerich migrate --name add_column --name是給這次遷移起個名字

不加–name,有個默認的名字
遷移文件名的格式為 {version_num}{datetime}{name|update}.py。
在這里插入圖片描述
在這里插入圖片描述

注意,此時sql并沒有執行,數據庫中course表中沒有xxx字段
在這里插入圖片描述

4. 重新執行遷移,寫入數據庫

aerich upgrade
在這里插入圖片描述

此時,就把模型類中新添加愛的字段更新到數據庫中了
在這里插入圖片描述

5. 回到上一個版本

aerich downgrade
在這里插入圖片描述

再看下數據庫,新加的字段又沒了,回退了
在這里插入圖片描述

6. 查看歷史遷移記錄

aerich history
在這里插入圖片描述

5、選課系統接口開發

先看看各個表數據
班級表
在這里插入圖片描述

教師表
在這里插入圖片描述

課程表
在這里插入圖片描述

學生表
在這里插入圖片描述

學生課程表
在這里插入圖片描述

我們在項目下建個包api,在這個包里面寫接口
api/student.py

from fastapi.exceptions import HTTPException#導入models
from models import *from pydantic import BaseModel
from typing import List, Union
from fastapi import APIRouterapi_student = APIRouter()#查看所有學生,注意,tortoise處理數據庫要用異步,路徑函數前面加async
@api_student.get("/")
async def getAllStudent():#注意,與數據庫的操作要加await,得到的是列表類型數據,[Student(),Student(),Student()....]students = await Student.all()print('students',students,type(students))return students#查看某個學生,基于路徑參數
@api_student.get("/{student_id}")
async def getOneStudent(student_id:int):#注意,與數據庫的操作要加awaitstudent = await Student.all().values("name", "clas__name")return student

在main.py導入api,并做路由分發

from fastapi import FastAPI  # FastAPI 是一個為你的 API 提供了所有功能的 Python 類。
import uvicorn
from tortoise.contrib.fastapi import register_tortoisefrom settings import TORTOISE_ORM#導入api
from api.student import api_student#創建應用程序,app是應用程序名
app = FastAPI()  # 這個實例將是創建你所有 API 的主要交互對象。這個 app 同樣在如下命令中被 uvicorn 所引用#路由分發
app.include_router(api_student, prefix="/student", tags=["學生信息接口", ])# 該方法會在fastapi啟動時觸發,內部通過傳遞進去的app對象,監聽服務啟動和終止事件
# 當檢測到啟動事件時,會初始化Tortoise對象,如果generate_schemas為True則還會進行數據庫遷移
# 當檢測到終止事件時,會關閉連接
register_tortoise(app,#數據庫配置信息config=TORTOISE_ORM,# generate_schemas=True,  # 如果數據庫為空,則自動生成對應表單,生產環境不要開# add_exception_handlers=True,  # 生產環境不要開,會泄露調試信息
)if __name__ == '__main__':#注意,run的第一個參數 必須是文件名:應用程序名uvicorn.run("main:app", port=8080,  reload=True, workers=1)

運行程序
在這里插入圖片描述

執行查詢所有學生
在這里插入圖片描述

(1)all查詢,查詢出來的是個list類型數據

在這里插入圖片描述

循環遍歷
#循環打印
for stu in students:
print(stu.name, stu.sno)
在這里插入圖片描述

(2)過濾查詢,查詢指定內容filter,得到的依然是list類型數據

student = await Student.filter(name='liuxin')
print(student,type(student))
#得到具體數據
print(student[0].name)

在這里插入圖片描述

(3)get方法,直接查詢

#get方法
student = await Student.get(name="wangfang")
print(student,type(student))
print(student.name,student.sno)

此時得到的就是模型類對象,可以直接獲取屬性值
在這里插入圖片描述

(4)模糊查詢,查詢學號大于2001的學生

students = await Student.filter(sno__gt=2001)
print(students)

得到的也是列表
在這里插入圖片描述

#查詢學號是2001和2002的學生,在某個范圍內,用__in
students = await Student.filter(sno__in=[2001,2002])

在這里插入圖片描述

(5)values查詢

只查出指定字段數據,得到的是列表套字典數據,有幾個字典,取決于查詢出幾條記錄
students = await Student.filter(sno__range=[1, 10000]).values(‘name’,‘sno’)
for stu in students:
print(stu)

在這里插入圖片描述

(6)將數據庫數據顯示到web頁面

在student.py 這個api文件里面
返回頁面模板

#導入模板的包
from fastapi.templating import Jinja2Templates# 實例化Jinja2對象,并將文件夾路徑設置為以templates命名的文件夾
templates = Jinja2Templates(directory="templates")接口:
@api_student.get("/index")
async def show_student(request:Request):students = await Student.all()return templates.TemplateResponse('index.html', #第一個參數放模板文件{'request': request,  # 注意,返回模板響應時,必須有request鍵值對,且值為Request請求對象'students':students}, #context上下文對象,是個字典)

創建templates文件夾下的index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>學生信息</title>
</head>
<body><p>學生信息頁面</p><ul>{% for stu in students %}<li>姓名: {{stu.name}} 學號: {{stu.sno}}</li>{% endfor%}
</ul></body>
</html>

在這里插入圖片描述

啟動程序,訪問
在這里插入圖片描述

瀏覽器訪問
在這里插入圖片描述

當然,也可以借助bootstrap讓頁面更好看

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>學生信息</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
</head>
<body><div class="col-md-8 offset-md-2"><h2>學生信息</h2><table class="table table-hover table-striped"><thead><tr><td>姓名</td><td>學號</td><td>班級</td></tr></thead><tbody>{% for student in students%}<tr><td>{{student.name}}</td><td>{{student.sno}}</td><td>{{student.clas_id}}</td></tr>{%endfor%}</tbody>
</table>
</div></body>
</html>

在這里插入圖片描述

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

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

相關文章

Oracle 11g升級19c 后部分查詢功能很慢

*Oracle 11g升級19c 后部分查詢功能很慢 今天生產突然有個查詢非常慢&#xff0c;日志顯示執行了50秒左右&#xff0c;但是從日志中拿出SQL在PLSQL執行&#xff0c;發現用時不到1秒&#xff0c;查看SQL,懷疑是下面幾種原因導致 1、使用函數不當 UNIT.UNIT_CODE LIKE CONCAT(‘…

狀態碼轉文字!!!(表格數字轉文字)

1、應用場景&#xff1a;在我們的數據庫表中經常會有status這個字段&#xff0c;這個字段經常表示此類商品的狀態&#xff0c;例如&#xff1a;0->刪除&#xff0c;1->上架&#xff0c;0->下架&#xff0c;等等。 2、我們返回給前端數據時&#xff0c;如果在頁面顯示0…

python 線程、進程區別與事例

線程&#xff1a;簡單來說&#xff0c;一個進程中包含多個線程&#xff0c;比如打開一個 QQ&#xff08;進程&#xff09;&#xff0c;然后你一邊聊 QQ&#xff08;一個線程&#xff09;&#xff0c;一邊用 QQ 傳送文件&#xff08;一個線程&#xff09;&#xff0c;等等。在一…

Linux中如何執行腳本

要執行一個保存在文件中的腳本&#xff0c;可以按照以下步驟進行&#xff1a; 1. 創建腳本文件&#xff1a; 首先&#xff0c;使用文本編輯器&#xff08;如 ?vi?、?nano?等&#xff09;創建一個新的腳本文件&#xff0c;并將需要執行的命令寫入到文件中。例如&#xff0…

【Unity】在Unity中導出WebGL并讀取Excel數據的實現方法

在游戲開發中&#xff0c;數據的處理和導出是至關重要的環節之一。Unity作為一款強大的游戲開發引擎&#xff0c;提供了豐富的工具和功能來處理和導出數據&#xff0c;包括將游戲導出為WebGL應用&#xff0c;并讀取外部數據文件&#xff0c;比如Excel表格。本文將介紹如何在Uni…

gpt生成器,批量gpt文章生成器

GPT&#xff08;生成式預訓練模型&#xff09;生成器軟件在當今的數字化時代扮演著越來越重要的角色&#xff0c;它們通過人工智能技術&#xff0c;可以自動生成各種類型的文章內容&#xff0c;為用戶提供了無限的創作可能性。本文將介紹6款不同的GPT生成器軟件&#xff0c;并介…

STM32自學?AD單通道

程序的最終運行成果: 當轉動電位器時&#xff0c;數值和電壓值發生變化 ad.c文件 #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "ad.h" #include "stdint.h" void ad_Init(void) { /* 初始化步驟&#xff1a;…

java學習筆記-初級

一、變量 1.雙標簽 <!-- 外部js script 雙標簽 --><script srcmy.js></script> 在新文件my.js里面寫&#xff1a; 2.字符串定義&#xff1a; //外單內雙var str 我是一個"高富帥"的程序員;console.log(str);// 字符串轉義字符 都是用 \ 開頭 …

并發編程中常見的設計模式,c++多線程如何設計

C多線程設計&#xff08;任務的“多對一”、“一對多”、“多對多”情況 該如何設計線程&#xff1f;&#xff09; C書籍中并未找到對多線程設計&#xff0c;有很完整詳細的總結&#xff01;&#xff01;C并發編程書籍中也只是一些理論或則零散的多線程實例。無奈&#xff0c;…

MySQL-MHA搭建、故障測試

一、架構說明 MHA&#xff08;Master High Availability&#xff09;是一個用于 MySQL 主從復制管理和自動故障轉移的開源工具集。MHA 的主要目的是提供 MySQL 環境的高可用性和自動故障轉移功能&#xff0c;確保在主庫發生故障時能夠快速切換到備庫&#xff0c;降低業務中斷時…

ElasticSearch之Completion Suggester

寫在前面 通過completion suggester可以實現如下的效果&#xff1a; 其實就是做的like xxx%這種。通過FST這種數據結構來存儲&#xff0c;實現快速的前綴匹配&#xff0c;并且可以將es所有的數據加載到內存中所以速度completion的查詢速度非常快。 需要注意&#xff0c;如果…

JWT令牌的使用教程

一、導入maven依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> 二、導入JWT工具類 &#xff08;工具類&#xff09; import io.jsonwebtoken.Cl…

HUAT——Fasc——算法組學習筆記

目錄 系列文章目錄 前言 一、配置相關環境 二、創建工作空間 1.創建工作空間并初始化 2.進入 src 創建 ros 包并添加依賴 三、HelloWorld(C版) 1.進入 ros 包的 src 目錄編輯源文件 2.編輯 ros 包下的 Cmakelist.txt文件 3.進入工作空間目錄并編譯 四 運行程序 五 …

docker 基礎(二)

常見命令 Docker最常見的命令就是操作鏡像、容器的命令&#xff0c;詳見官方文檔&#xff1a;https://docs.docker.com/ 數據卷 命令說明文檔地址docker volume create創建數據卷docker volume createdocker volume ls創建數據卷docker volume lsdocker volume rm查看所有數…

asp.net core webapi接收application/x-www-form-urlencoded和form-data參數

框架&#xff1a;asp.net core webapiasp.net core webapi接收參數&#xff0c;請求變量設置 目錄 接收multipart/form-data、application/x-www-form-urlencoded類型參數接收URL參數接收上傳的文件webapi接收json參數 接收multipart/form-data、application/x-www-form-urlenc…

Swiper實現輪播效果

swiper官網&#xff1a;https://3.swiper.com.cn/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

中間件-Nginx加固(控制超時時間限制客戶端下載速度并發連接數)

中間件-Nginx加固&#xff08;控制超時時間&限制客戶端下載速度&并發連接數&#xff09; 1.1 Nginx 控制超時時間配置1.2 Nginx 限制客戶端下載速度&并發連接數 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 1.1 Nginx 控制超…

TypeScript07:枚舉enum

一、擴展類型 擴展類型&#xff1a;類型別名、枚舉、接口、類。 枚舉&#xff1a;通常用于約束某個變量的取值范圍。 字面量和聯合類型配合使用&#xff0c;也可以達到同樣的目標。 二、字面量類型的問題 在類型約束位置&#xff0c;會產生重復代碼。可以使用類型別名解…

PSMC:繪圖腳本 psmc_plot.pl 腳本參數詳解

=> psmc_plot.plUsage: psmc_plot.pl [options] <out.prefix> <in.psmc>Options: -u FLOAT absolute mutation rate per nucleotide [2.5e-08]-s INT skip used in data preparation [100]-X FLOAT maximum generations,

機器學習圖像識別如何處理標簽以外的圖像?

機器學習圖像識別技術是一種基于人工智能的圖像處理方法&#xff0c;它通過訓練大量的圖像數據集來讓計算機學習如何識別和分類圖像。在圖像識別任務中&#xff0c;我們通常需要對圖像進行標注和分類&#xff0c;以便讓計算機能夠從中學習。但是&#xff0c;有時候我們可能會遇…