FastAPI如何优雅的连接数据库?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: FastAPI如何优雅的连接数据库?

大家好,我是Kuls。

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

在前面一篇文章中,我们有去写一个简单的博客框架,对它的路径、查询参数及路径参数函数等进行了学习。

今天我们来学习FastAPI的数据库连接,当然我们不仅仅只是为了学习这个知识点而学习。

今天K哥也来给大家说说如何去优雅的写一个FastAPI项目。


1.png


这是我今天所要讲解所编写项目的文件格式。

大家可以看到我们会在里面新建一个blog库来存放我们编写博客相关的操作,而不是像前面我们所写的,直接写一个main.py就行了。

那样对于我们编写一个项目是不太好的。

我们编写一个项目可以先创建一个虚拟环境,如果你还不懂虚拟环境是什么,可以去看下我的这篇文章 虚拟环境真的太重要了,很多人还不知道!


$ cd demo3-blog/
$ ls
__init__.py             blog                    requirements.txt
$ python -m venv blogenv
$ ls
__init__.py             blog                    blogenv                 requirements.txt
$ source blogenv/bin/activate


随后创建一个requeriment.txt,里面填写这个项目要使用的第三方库。


fastapi
uvicorn
sqlalchemy
pymysql


执行


pip install -r requeriment.txt


好了,上面其实算是题外话。

今天我们的主角其实是SQLAlchemy,可能之前学过Django或Flask的同学应该接触过SQLAlchemy。

我们看下官网的解释:SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.

简答理解,它是一个sql工具箱,是一个ORM框架。

ORM:对象关系映射,你可以简单理解为 Python中的一个类映射一张数据表。

其实关于SQLAlchemy,里面有很多的知识,我也把它的详细的基础使用方法链接给大家。

官方文档:https://docs.sqlalchemy.org/en/14/orm/tutorial.html

本篇文章中我们也会学习SQLAlchemy。


database.py

还记得我们创建的database.py文件吗?我们将会在这里面编写数据库相关的内容:


from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://user:password@localhost/fastapi'
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()


这里我们一行一行来进行分析


engine = create_engine(SQLALCHEMY_DATABASE_URL)'


这一行创建了我们的数据库引擎,我们就是通过这个引擎来创建表等各种操作的。其中的参数就是我们数据库的连接url,fastapi支持的数据库非常的多。

这里提醒一下,如果我们使用的是sqlite数据库,我们需要在create_engine的参数中新增connect_args={"check_same_thread": False}

下面也是官网给出的支持的数据库,这些我们都可以通过sqlalchemy来进行连接。

PostgreSQLMySQLSQLiteOracleMicrosoft SQL Server, etc.

关于具体数据库的url是啥,这里我给出官网,大家可以进行查阅

https://docs.sqlalchemy.org/en/14/core/engines.html


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


这里我们创建的是SessionLocal,后续我们用到会进行讲解。


Base = declarative_base()


通过declarative_base()方法生成的类,该类是我们后面要用到的ORM 模型所要继承的父类。


models.py

既然数据库相关的配置都弄好了,接下来我们编写一个模型。

其实这个模型在我们上一篇文章中就已经编写过了。

但是还是有一些不同


from sqlalchemy import Column, Integer, String, Boolean
from .database import Base
class Blog(Base):
    __tablename__ = 'blog'
    id = Column(Integer, primary_key=True, index=True) # 设置主键和索引
    title = Column(String(32))
    content = Column(String(32))
    pulished = Column(Boolean)


大家可以发现,其实非常的直观和简单,无非就是创建一个类,里面有一些字段变量。

其中的__tablename__表示的是我们待会创建数据表的名称。


schemas.py

这个其实很简单,就是将我们在main.py中所编写的


from pydantic import BaseModel
from typing import Optional
class Blog(BaseModel):
    title: str
    content: str
    published: Optional[bool]


这部分内容搬到了一个新的文件当中,方便我们统一管理。


main.py

其实main.py跟我们上一篇文章的中的main.py差不多,只是多了几行代码:


from fastapi import FastAPI
from .database import engine
from . import schemas,models
from typing import Optional
app = FastAPI()
models.Base.metadata.create_all(engine)
# 博客首页
@app.get('/blog')
def index(limit: int = 10, published: bool = True, sort: Optional[str] = None):
    return {'data': f'我是博客首页,显示{limit}篇内容,并且发布状态为{published},排序顺序是根据{sort}字段'}
@app.get('/blog/unpublished')
def unpublished():
    return {'data': '这里是没有发布的博文列表'}
@app.get('/blog/{id}')
def showblog(id: int):
    return {'data': f'这是id为 {id} 的博文'}
@app.get('/blog/{id}/comments')
def comments(id: int):
    return {'data': f'这是id为{id}的博文评论内容'}
@app.post('/blog')
def new_blog(blog: schemas.Blog):
    return {'data': f'博文标题:{blog.title},博文内容:{blog.content},博文发表状态:{blog.published}'}


其中的create_all()方法就帮助我们创建了数据表


运行

到了这里基本就大功告成。

我们直接运行


2.png


查看数据库,发现我们的数据表已经成功创建。


3.png


总结

好了,今天主要讲了数据库相关的操作以及编写项目时的注意事项。

数据库具体的读写删操作,我们会在后面继续写,也会基于这个blog来写。

因为公众号改版,所以大家一定要记得星标公众号。

整个系列的代码我都放在了github中,大家可以访问下面链接:

https://github.com/hellokuls/fastapi/tree/master

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
128 68
|
21天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
19天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
19天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
50 3
|
19天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
19天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
34 1
|
1月前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
50 1
|
1月前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
64 0