做门户类网站报价,卖磁铁的网站怎么做,大连网站建设收费,河北三河建设厅网站6文章目录 Fastapi ORM操作1、创建模型2、创建数据库连接配置文件3、启动项目4、根据模型类创建数据库表1. 初始化配置#xff0c;只需要使用一次2. 初始化数据库#xff0c;一般情况下只用一次3. 更新模型并进行迁移4. 重新执行迁移#xff0c;写入数据库5. 回到上一个版本6… 文章目录 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官方代码里面使用的是sqlalchemyTortoise ORM 是受 Django 启发的易于使用的异步 ORM 对象关系映射器。
Tortoise ORM 目前支持以下[数据库]
PostgreSQL 9.4使用asyncpgSQLite使用aiosqliteMySQL/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_length255, description班级名称)#创建老师类
class Teacher(Model):id fields.IntField(pkTrue)name fields.CharField(max_length255, description姓名)tno fields.IntField(description账号)pwd fields.CharField(max_length255, description密码)#课程表
class Course(Model):id fields.IntField(pkTrue)name fields.CharField(max_length255, description课程名)teacher fields.ForeignKeyField(models.Teacher, related_namecourses, description课程讲师)#创建学生类
class Student(Model):id fields.IntField(pkTrue)sno fields.IntField(description学号)#description 在接口文档有个显示pwd fields.CharField(max_length255, description密码)name fields.CharField(max_length255, description姓名)# 一对多反向查询时使用related_nameclas fields.ForeignKeyField(models.Clas, related_namestudents)# 多对多courses fields.ManyToManyField(models.Course, related_namestudents,description学生选课表)2、创建数据库连接配置文件
创建settings.py 配置文件
TORTOISE_ORM {connections: {default: {# engine: tortoise.backends.asyncpg, PostgreSQLengine: tortoise.backends.mysql, # MySQL or Mariadbcredentials: {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,#数据库配置信息configTORTOISE_ORM,# generate_schemasTrue, # 如果数据库为空则自动生成对应表单生产环境不要开# add_exception_handlersTrue, # 生产环境不要开会泄露调试信息
)if __name__ __main__:#注意run的第一个参数 必须是文件名:应用程序名uvicorn.run(quickstart:app, port8080, reloadTrue, workers1)启动没报错表示正常连接到了数据库
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.inimigrations存放迁移文件
2. 初始化数据库一般情况下只用一次
将我们在models.py里面配置的表创建到数据库中 aerich init-db
此时数据库中就有相应的表格如果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,#数据库配置信息configTORTOISE_ORM,# generate_schemasTrue, # 如果数据库为空则自动生成对应表单生产环境不要开# add_exception_handlersTrue, # 生产环境不要开会泄露调试信息
)if __name__ __main__:#注意run的第一个参数 必须是文件名:应用程序名uvicorn.run(main:app, port8080, reloadTrue, workers1)运行程序
执行查询所有学生
(1)all查询查询出来的是个list类型数据 循环遍历 #循环打印 for stu in students: print(stu.name, stu.sno)
(2)过滤查询查询指定内容filter,得到的依然是list类型数据
student await Student.filter(nameliuxin)
print(student,type(student))
#得到具体数据
print(student[0].name)(3)get方法直接查询
#get方法
student await Student.get(namewangfang)
print(student,type(student))
print(student.name,student.sno)此时得到的就是模型类对象可以直接获取属性值
(4)模糊查询,查询学号大于2001的学生
students await Student.filter(sno__gt2001)
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(directorytemplates)接口
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 langen
headmeta charsetUTF-8title学生信息/title
/head
bodyp学生信息页面/pul{% for stu in students %}li姓名: {{stu.name}} 学号: {{stu.sno}}/li{% endfor%}
/ul/body
/html启动程序访问
浏览器访问
当然也可以借助bootstrap让页面更好看
!DOCTYPE html
html langen
headmeta charsetUTF-8title学生信息/titlelink hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0-alpha1/dist/css/bootstrap.min.css relstylesheetintegritysha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD crossoriginanonymous
/head
bodydiv classcol-md-8 offset-md-2h2学生信息/h2table classtable table-hover table-stripedtheadtrtd姓名/tdtd学号/tdtd班级/td/tr/theadtbody{% for student in students%}trtd{{student.name}}/tdtd{{student.sno}}/tdtd{{student.clas_id}}/td/tr{%endfor%}/tbody
/table
/div/body
/html