FastAPI+SQLAlcheym,从数据库添加、删除、修改、查询
FastAPI
数据库操作通常由SQLAlchemy
执行。这主要是因为后者以面向对象的方式对表进行操作。 ,同时SQLAlchemy
采用统一的接口,将程序和数据库分离,降低耦合程度。
在FastAPI
的官方文档中,有专门针对SQLAlcheym
的介绍,但是本例中有两个表,constrat。为了让刚入门的同学更清楚快速掌握数据库中FastAPI
的操作,本文将通过一个简单的表格来讲解如何实现增删改查。在FastAPI
中对数据库进行操作。
总体思路
在官方文档中,FastAPI
使用SQLAlchemy
清晰明确的数据模块操作来进行数据库操作。通常用五个文件来实现:
- 数据库配置文件:
databases.py
,主要完成与数据库的连接; - 数据库中表对应的模型文件:
models.py
,创建所需表对应的数据模型; - 数据库中的表对应的schema文件:
schemas.py
,这里的pydantic
用来完成基础分类验证的Core数据表。到桌子上。models.py
中和classes的区别是:models.py
对应的是table,而schema适用于基于Table模型的不同场景的类。
- 创建、删除、修改、查看操作文件:
crud.py
。该文件主要处理数据库的各种读写操作。 - 主文件
main.py
,其中配置了get
、等各种路线和方法❀❀。
本例中将使用图书数据库来实现添加、删除、修改和搜索操作。接下来,让我们看看各种文件设置。
数据库连接
在本例中,我们将使用数据库 上面的代码中,通过创建变量 温馨提示:如果要使用 为了方便演示,这里的数据表只包含三列: 在上面的代码中,我们创建了一个类 这里我们使用 在上一篇文章中,我们介绍了使用 上面的代码中,类 当然,我们可以利用类继承功能将上面的代码改写如下: 将对数据表的操作收集到一个单独的文件中,并创建该文件在同一个目录下 需要注意的是,在上面修改书本的代码中,我们使用了 最后我们在该目录下的文件 至此,五个文件全部完成。接下来,我们需要测试该功能。 导入文件时,请确保: 在上面的文件中,我们使用 我们采用打开文件夹 下图为创建的五种文件组织形式: 然后你会在one目录中找到上面创建的数据库文件 当然可以,使用工具这个软件数据库可以运行和查看,但是在 在浏览器地址栏输入 上面的页面称为❀❀s界面,这是一个软件独立运行,但与 添加数据 要添加数据,请使用方法 查看右侧的按钮 点击执行按钮后,程序将进行验证。如果为 true,则上述数据将添加到数据库中。 现在,打开 在程序中,我们编写的是支持模糊语句的,所以我们只要需要输入单词进行搜索,点击问题行,如下图: 32.png ]] 根据数字 点击执行最后,使用 删除很容易。上面写的程序是根据书的编号 输入图书输入编号id 本文通过一个小例子来说明如何使用sqlite3
来管理图书数据库。这里需要注意的是,如果使用了sqlite3
,那么标签配置check_same_thread
必须设置为False。这是因为:
sqlite3
数据库本身不是网络数据库,默认只能在同一个线程中使用。如果未设置此标签,SQLAlchemy
将收到错误消息。具体代码如下: from sqlalchemy import create_engine # type: ignore
from sqlalchemy.ext.declarative import declarative_base # type: ignore
from sqlalchemy.orm import sessionmaker # type: ignore
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
SessionLocal
,将当前数据库的连接保存下来,以便在其他文件中导入使用。 Base
是SQLAlchemy
的公共类,数据库表对应的数据模型必须继承。 mysql
数据库,连接字符串如下: "mysql+pymysql: // username:password@name8?:set=databaseutf
Build模型数据表
ID
、书名、价格。在当前目录下创建文件models.py
代码如下: from sqlalchemy import Column, Integer, String # type: ignore
from .database import Base
class Books(Base):
__tablename__ = "books"
id = Column(Integer, primary_key=True, index=True)
bookname = Column(String(100), unique=True)
prices = Column(Integer)
Book
,表名为book
,这个类包含了前面提到的三列,注意,book这里的标题价格用整数表示。from .database import Base
来导入我们刚刚创建的基类,有的编辑器会在这里提示导入警告。方法,即在当前文件夹中创建一个新文件。该文件是空的 __init__.py
,因此语法检查器会认为它是一个包,可以在没有警告消息的情况下导入。创建架构文件
pydantic
来检查前端数据传输功能。这里我们也是利用这个包来完成输入或输出数据类的设置。在同一目录下创建文件schemas.py
,并创建一个与模型类一模一样的类。这里主要是利用属性id
来完成变更对于功能data,在创建新数据时创建一个没有id的类。代码如下:
from typing import Union
from pydantic import BaseModel
class Books(BaseModel):
id: Union[int, None]=None
bookname : str
prices : Union[int, None] = None
class Config:
orm_mode = True
class BooksBase(BaseModel):
bookname : str
prices : Union[int, None] = None
Books
有一个内部类类Config
,这是❀中的配置,这是❀中的配置 将 orm_mode
设置为 True
,这告诉 pydantic
可以直接映射到对象模型。类 BooksBase
仅验证数据。 from typing import Union
from pydantic import BaseModel
class BooksBase(BaseModel):
bookname : str
prices : Union[int, None] = None
class Books(BooksBase):
id: Union[int, None]=None
class Config:
orm_mode = True
增删改查
crud.py
,添加、删除、修改、检查代码如下:from datetime import date
from sqlalchemy.orm import Session
from . import models, schemas
# 根据书名查询,支持模糊查询
def get_books_by_name(db: Session, bookname: str):
return db.query(models.Books).filter(models.Books.bookname.like(f"%{bookname}%")).all()
# 根据书的`ID`删除
def delete_book_by_Id(db:Session, bookId:int):
db_book = db.query(models.Books).filter(models.Books.id == bookId).one_or_none()
if db_book is None:
return None
db.delete(db_book)
db.commit()
return True
# 增加书籍信息
def create_book(db:Session, book:schemas.BooksBase):
curBook = models.Books(
bookname = book.bookname,
prices = book.prices,
)
db.add(curBook)
db.commit()
db.refresh(curBook)
return curBook
# 根据书的`ID`修改书籍信息
def update_book_by_id(db:Session, bookId:int, book:schemas.BooksBase):
db_book = db.query(models.Books).filter(models.Books.id == bookId).one_or_none()
if db_book is None:
return None
# Update model class variable from requested fields
for var, value in vars(book).items():
setattr(db_book, var, value) if value else None
db.commit()
db.refresh(db_book)
return db_book
vars
in Python
该函数可以列出字典中对象的所有属性。 集成路由
main.py
中设置各种路由,并调用中的函数
污垢。并检查数据表。代码如下:
上一级,在命令窗口中运行以下命令: from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session #type: ignore
from . import crud, schemas, models
from .database import SessionLocal, engine
# 根据模板文件创建对应的数据表
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
# 设定数据库连接
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# 查询书籍
@app.get("/books/", response_model=list[schemas.Books])
def get_hospital_nums(bookname:str, db:Session=Depends(get_db)):
db_books = crud.get_books_by_name(db, bookname=bookname)
if not db_books:
raise HTTPException(status_code=400, detail="当前书籍名称未查询到相匹配的书籍。")
return db_books
# 删除书籍
@app.post("/deleteBook/{bookid}")
def delete_book(bookid:int, db:Session=Depends(get_db)):
return crud.delete_book_by_Id(db, bookId=bookid)
# 修改书籍
@app.post("/updateBook/{bookid}", response_model=schemas.Books)
def update_book(bookid:int, book:schemas.BooksBase, db:Session=Depends(get_db)):
return crud.update_book_by_id(db, bookId=bookid, book=book)
# 新增书籍
@app.post("/books/", response_model=schemas.Books)
def create_book(book: schemas.BooksBase, db: Session = Depends(get_db)):
db_book = crud.get_books_by_name(db, bookname=book.bookname)
if db_book:
raise HTTPException(status_code=400, detail="该书籍已经存在。")
return crud.create_book(db=db, book=book)
from 。 import XXX
导入当前文件夹中的其他文件。这种情况下,如果要打开成功,需要将目录切换到顶层backend
才能打开。如果省略.
,直接使用import XXX
导入当前文件夹中的其他文件,则需要在当前目录下打开服务器后端uvicorn命令
。 backend
上一级服务器的方法。测试添加、删除、编辑、查看功能
![[2022-09-29_15-59.png]]❀❀目录到 在backenduvicorn backend.main:app --reload --port 8001
sql_app.db backend
。这时候如果你用DB Browser for SQLite
软件查看数据库文件,你会发现我们定义的表已经创建好了,如下图: FastAPI
中,有一个非常强大的文档功能,可以让我们测试我们刚刚编写的程序。 http://127.0.0.1:8001/docs
,可以看到如下页面: FastAPI
结合使用来管理数据。这只是用来测试上面写的代码是否能够成功操作数据库。 POST
。该地址还使用 /buku/
。单击该字段,如下图所示: 尝试
。直接点击在编辑框中添加数据,如下: DB Browser for SQLite
,就可以看到添加的数据,如下图: 查询
修改
id
修改程序。因此,修改时需要填写数字id
,打开修改字段: DB Browser for SQLite 从上图中,我们已成功修改提到的数据。
后,点击执行即可删除记录。运行结果如下: 删除
id
来删除的。点击界面swagger
: 总结
FastAPI
和来修改和检查数据库。了解这个过程将有助于我们更深入地理解
FastAPI
是如何操作数据库的。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。