大家好,我是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()是个啥玩意?
其实你可以简单理解成依赖注入,我们点进去看源码
我们可以发现Depends()里的参数有两个dependency、use_cache,我们主要关注的就是dependency,英文含义就是依赖,可以发现我们可以传入函数以及类。
也就是说这个参数它会依赖于这个函数或者类来生成。
我们这里的db也就是依赖于get_db()这个函数来生成的。
编写好函数,我们前往swagger进行测试
Request body:
{ "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库
获取所有博客
聊完了新建博客,下面我们聊聊如何去获取所有的博客。
这个函数我们在之前也有设计过,这里我给你打印出来
# 博客首页 @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里面进行测试:
接下来我们继续改造之前的函数,还记得我们是如何获取单篇文章内容的吗?
获取单篇博客
这里我已经把它改造好了:
@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()则代表我们只想获取到符合要求的第一条数据。显然这里是只有一条的。
同样,我们也去测试一下。
非常的简单!
删除某篇博客
相信看到这里,大家都知道如何去删除一篇博客了。
@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已经被成功删除了。
更新博客
我们首先新建一条博客
如何更新一条博客呢?
@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,不然会报错的哦。
执行后成功!
总结
今天我们实现了以下的基本数据库操作
大家最好要动手操作一下!这个非常重要。