FastAPI的数据库操作终于整明白了!

简介: FastAPI的数据库操作终于整明白了!

大家好,我是Kuls。

这是《小白学FastAPI》系列的第五篇文章。

如果你还没有看前面四篇文章,可以先去看下前面四篇再看此篇。

今天我们要讲的是如何去操作数据库,我们还是通过我们的博客案例来给大家讲解。

在上篇文章中,我们已经将博客项目的大体框架都写好了,包括数据库引擎相关的内容。

那么我们该如何实际去操作数据库呢?

也就是如何对数据库进行增删改查

其实也非常的简单。


SessionLocal

还记得我们在database.py中创建的SessionLocal吗?


SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)


我们的操作都是基于它来实现的!

首先,我们从database.py中导入它


from .database import SessionLocal
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


然后编写函数get_db()来用于获取sessionLocal以及及时关闭连接。

大家还记得我们之前所编写的new_blog()函数吗?也就是新增一篇博客的函数。

今天我们将它与数据库进行具体实现。


新增博客


from fastapi import Depends
@app.post('/blog')
def new_blog(blog: schemas.Blog, db: Session = Depends(get_db)):
    newBlog = models.Blog(title=blog.title, content=blog.content, published=blog.published)
    db.add(newBlog)
    db.commit()
    db.refresh(newBlog)
    return newBlog


这个地方可能有些人会困惑Depends()是个啥玩意?

其实你可以简单理解成依赖注入,我们点进去看源码


1.png


我们可以发现Depends()里的参数有两个dependency、use_cache,我们主要关注的就是dependency,英文含义就是依赖,可以发现我们可以传入函数以及类。

也就是说这个参数它会依赖于这个函数或者类来生成。

我们这里的db也就是依赖于get_db()这个函数来生成的。

编写好函数,我们前往swagger进行测试

http://127.0.0.1:8000/docs

Request body:


{
  "title": "文章标题",
  "content": "文章内容",
  "published": true
}


2.png


3.png


可以看到插入成功了!

但是这里也有一点点小小的问题,我们可以看到swagger当中给我们返回的响应码是200,熟悉响应码的朋友可能知道,如果是新建xxx,响应码应该返回201,而不是200。

那么fastapi能不能实现呢?

其实也是非常的简单,我们只需要在@app.post('/blog'),加上一个参数@app.post('/blog', status_code=201)


4.png


可以看到,返回的是201。

如果你想要更加详细了解响应码,可以前往官网查看

https://docs.python.org/3/library/http.html#http.HTTPStatus

fastapi也给我们提供了各种响应码的选择,只需要导入fastapi.status库


5.png


获取所有博客

聊完了新建博客,下面我们聊聊如何去获取所有的博客。

这个函数我们在之前也有设计过,这里我给你打印出来


# 博客首页
@app.get('/blog')
def index(limit: int = 10, published: bool = True, sort: Optional[str] = None):
    return {'data': f'我是博客首页,显示{limit}篇内容,并且发布状态为{published},排序顺序是根据{sort}字段'}


这里我们也需要加入db的参数:


# 博客首页
@app.get('/blog')
def index(limit: int = 10, published: bool = True, sort: Optional[str] = None, db: Session = Depends(get_db)):
    blogs = db.query(models.Blog).all()
    return blogs


通过db.query(models.Blog).all(),就能够查询到所有的结果,我们去swagger里面进行测试:


6.png


接下来我们继续改造之前的函数,还记得我们是如何获取单篇文章内容的吗?


获取单篇博客

这里我已经把它改造好了:


@app.get('/blog/{id}')
def showblog(id: int, db: Session = Depends(get_db)):
    blog = db.query(models.Blog).filter(models.Blog.id == id).first()
    return blog


通过filter函数,我们可以筛选出相应要求的数据,first()则代表我们只想获取到符合要求的第一条数据。显然这里是只有一条的。

同样,我们也去测试一下。


7.png


非常的简单!


删除某篇博客

相信看到这里,大家都知道如何去删除一篇博客了。


@app.delete('/blog/{id}', status_code=status.HTTP_204_NO_CONTENT)
def delete(id: int, db: Session = Depends(get_db)):
    db.query(models.Blog).filter(models.Blog.id == id).delete(synchronize_session=False)
    db.commit() # 别忘了哦
    return {"msg": "已经删除"}


首先通过id查找到对应的博客,然后调用delete方法将其删除。


8.png


9.png


前往swagger,发现id=1已经被成功删除了。


更新博客

我们首先新建一条博客


10.png


如何更新一条博客呢?


@app.put('/blog/{id}')
def update(id: int,blog: schemas.Blog, db: Session = Depends(get_db)):
    db.query(models.Blog).filter(models.Blog.id == id).update(blog.dict())
    db.commit()
    return {"msg": "成功更新!"}


我们用到了put方法。特别需要注意的是update(blog.dict()),我们需要把blog对象转化为dict,不然会报错的哦。


11.png


执行后成功!


12.png


总结

今天我们实现了以下的基本数据库操作


13.png


大家最好要动手操作一下!这个非常重要。

相关文章
|
SQL Oracle 关系型数据库
FastAPI数据库系列(一) MySQL数据库操作 一、简介
FastAPI中你可以使用任何关系型数据库,可以通过SQLAlchemy将其轻松的适应于任何的数据库,比如: PostgreSQL MySQL SQLite Oracle Microsoft SQL Server ...
|
3月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
145 1
|
6月前
|
关系型数据库 MySQL API
Python web框架fastapi数据库操作ORM(一)
Python web框架fastapi数据库操作ORM(一)
715 2
|
6月前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
307 1
|
数据库
FastAPI 学习之路(三十四)数据库多表操作
FastAPI 学习之路(三十四)数据库多表操作
FastAPI 学习之路(三十四)数据库多表操作
|
存储 关系型数据库 MySQL
FastAPI第四天---数据库与模块化管理
FastAPI第四天---数据库与模块化管理
343 0
FastAPI第四天---数据库与模块化管理
|
关系型数据库 MySQL 数据库
FastAPI 学习之路(六十一)使用mysql数据库替换sqlite数据库
FastAPI 学习之路(六十一)使用mysql数据库替换sqlite数据库
FastAPI 学习之路(六十一)使用mysql数据库替换sqlite数据库
|
测试技术 数据库
FastAPI 学习之路(五十三)根据环境不同连接不同数据库
FastAPI 学习之路(五十三)根据环境不同连接不同数据库
FastAPI 学习之路(五十三)根据环境不同连接不同数据库
|
存储 数据库连接 数据库
FastAPI 学习之路(三十三)操作数据库
FastAPI 学习之路(三十三)操作数据库
FastAPI 学习之路(三十三)操作数据库
|
Oracle 关系型数据库 MySQL
FastAPI 学习之路(三十二)创建数据库
FastAPI 学习之路(三十二)创建数据库
FastAPI 学习之路(三十二)创建数据库