前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastAPI的数据库操作终于整明白了!

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

作者头像
Python进击者
发布2022-03-14 19:46:37
4.8K0
发布2022-03-14 19:46:37
举报
文章被收录于专栏:JAVAandPython君JAVAandPython君

大家好,我是Kuls。

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

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

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

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

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

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

其实也非常的简单。

SessionLocal

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

代码语言:javascript
复制
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)

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

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

代码语言:javascript
复制
from .database import SessionLocal

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

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

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

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

新增博客

代码语言:javascript
复制
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()是个啥玩意?

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

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

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

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

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

http://127.0.0.1:8000/docs

Request body:

代码语言:javascript
复制
{
  "title": "文章标题",
  "content": "文章内容",
  "published": true
}

可以看到插入成功了!

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

那么fastapi能不能实现呢?

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

可以看到,返回的是201。

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

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

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

获取所有博客

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

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

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

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

代码语言:javascript
复制
# 博客首页
@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里面进行测试:

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

获取单篇博客

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

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

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

非常的简单!

删除某篇博客

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

代码语言:javascript
复制
@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方法将其删除。

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

更新博客

我们首先新建一条博客

如何更新一条博客呢?

代码语言:javascript
复制
@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,不然会报错的哦。

执行后成功!

总结

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

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

代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python进击者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SessionLocal
  • 新增博客
  • 获取所有博客
  • 获取单篇博客
  • 删除某篇博客
  • 更新博客
  • 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档