Code前端首页关于Code前端联系我们

FastAPI+SQLAlcheym,从数据库添加、删除、修改、查询

terry 2年前 (2023-09-24) 阅读数 62 #后端开发

FastAPI数据库操作通常由SQLAlchemy执行。这主要是因为后者以面向对象的方式对表进行操作。 ,同时SQLAlchemy采用统一的接口,将程序和数据库分离,降低耦合程度。

FastAPI的官方文档中,有专门针对SQLAlcheym的介绍,但是本例中有两个表,constrat。为了让刚入门的同学更清楚快速掌握数据库中FastAPI的操作,本文将通过一个简单的表格来讲解如何实现增删改查。在FastAPI中对数据库进行操作。

总体思路

在官方文档中,FastAPI使用SQLAlchemy清晰明确的数据模块操作来进行数据库操作。通常用五个文件来实现:

  1. 数据库配置文件:databases.py,主要完成与数据库的连接;
  2. 数据库中表对应的模型文件:models.py,创建所需表对应的数据模型;
  3. 数据库中的表对应的schema文件:schemas.py,这里的pydantic用来完成基础分类验证的Core数据表。到桌子上。 models.py中和classes的区别是:models.py对应的是table,而schema适用于基于Table模型的不同场景的类。
  4. 创建、删除、修改、查看操作文件:crud.py。该文件主要处理数据库的各种读写操作。
  5. 主文件main.py,其中配置了get等各种路线和方法❀❀。

本例中将使用图书数据库来实现添加、删除、修改和搜索操作。接下来,让我们看看各种文件设置。

数据库连接

在本例中,我们将使用数据库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,将当前数据库的连接保存下来,以便在其他文件中导入使用。

BaseSQLAlchemy的公共类,数据库表对应的数据模型必须继承。

温馨提示:如果要使用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]]❀❀目录到 在backend

上一级,在命令窗口中运行以下命令:
uvicorn backend.main:app --reload --port 8001

然后你会在one目录中找到上面创建的数据库文件sql_app.db backend 。这时候如果你用DB Browser for SQLite软件查看数据库文件,你会发现我们定义的表已经创建好了,如下图: FastAPI+SQLAlcheym,实现对数据库的增删改查

当然可以,使用工具这个软件数据库可以运行和查看,但是在FastAPI中,有一个非常强大的文档功能,可以让我们测试我们刚刚编写的程序。

在浏览器地址栏输入http://127.0.0.1:8001/docs,可以看到如下页面: FastAPI+SQLAlcheym,实现对数据库的增删改查

上面的页面称为❀❀s界面,这是一个软件独立运行,但与FastAPI 结合使用来管理数据。这只是用来测试上面写的代码是否能够成功操作数据库。

添加数据

要添加数据,请使用方法POST。该地址还使用 /buku/。单击该字段,如下图所示: FastAPI+SQLAlcheym,实现对数据库的增删改查

查看右侧的按钮尝试。直接点击在编辑框中添加数据,如下: FastAPI+SQLAlcheym,实现对数据库的增删改查

点击执行按钮后,程序将进行验证。如果为 true,则上述数据将添加到数据库中。 FastAPI+SQLAlcheym,实现对数据库的增删改查

现在,打开DB Browser for SQLite,就可以看到添加的数据,如下图: FastAPI+SQLAlcheym,实现对数据库的增删改查

查询

在程序中,我们编写的是支持模糊语句的,所以我们只要需要输入单词进行搜索,点击问题行,如下图: 32.png ]]

修改

根据数字id修改程序。因此,修改时需要填写数字id,打开修改字段: FastAPI+SQLAlcheym,实现对数据库的增删改查

点击执行最后,使用DB Browser for SQLite 从上图中,我们已成功修改提到的数据。

删除

删除很容易。上面写的程序是根据书的编号id来删除的。点击界面swaggerFastAPI+SQLAlcheym,实现对数据库的增删改查

输入图书输入编号id

后,点击执行即可删除记录。运行结果如下: FastAPI+SQLAlcheym,实现对数据库的增删改查

总结

本文通过一个小例子来说明如何使用FastAPI

来修改和检查数据库。了解这个过程将有助于我们更深入地理解FastAPI是如何操作数据库的。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门