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()是个啥玩意?

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


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


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

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

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

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

http://127.0.0.1:8000/docs

Request body:


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


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


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


可以看到插入成功了!

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

那么fastapi能不能实现呢?

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


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


可以看到,返回的是201。

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

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

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


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


获取所有博客

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

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


# 博客首页
@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里面进行测试:


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


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


获取单篇博客

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


@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()则代表我们只想获取到符合要求的第一条数据。显然这里是只有一条的。

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


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


非常的简单!


删除某篇博客

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


@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方法将其删除。


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


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


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


更新博客

我们首先新建一条博客


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


如何更新一条博客呢?


@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,不然会报错的哦。


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


执行后成功!


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


总结

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


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


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

上一篇:一分钟学Python| 面向对象(中)


下一篇:小白学自动化!终于开始写了!!!