FastAPI SQL数据库
在上一章中,一个Python列表被用作内存数据库,使用FastAPI执行CRUD操作。相反,我们可以使用任何关系型数据库(如MySQL、Oracle等)来执行存储、检索、更新和删除操作。
我们将使用 SQLAlchemy 作为Python代码和数据库之间的接口,而不是使用符合 DB-API 的数据库驱动程序(我们将使用SQLite数据库,因为Python对它有内置的支持)。SQLAlchemy是一个流行的SQL工具箱和 对象关系映射器。
对象关系映射是一种编程技术,用于在面向对象编程语言中不兼容的类型系统之间转换数据。通常,像Python这样的面向对象语言中使用的类型系统包含非标量类型。然而,大多数数据库产品中的数据类型,如Oracle、MySQL等,都是原始类型,如整数和字符串。
在ORM系统中,每个类都映射到底层数据库中的一个表。ORM不需要自己编写繁琐的数据库接口代码,而是为你解决这些问题,而你可以专注于系统的逻辑编程。
为了使用SQLAlchemy,我们需要首先使用PIP安装程序来安装该库。
SQLAlchemy被设计为与为特定数据库建立的DBAPI实现一起运行。它使用方言系统来与各种类型的DBAPI实现和数据库进行通信。所有的方言都需要安装一个合适的DBAPI驱动程序。
以下是包括的方言 –
- Firebird
- Microsoft SQL Server
- MySQL
- Oracle
- PostgreSQL
- SQLite
- Sybase
由于我们要使用SQLite数据库,我们需要为我们的数据库创建一个名为test.db的数据库引擎。从sqlalchemy模块导入 create_engine() 函数。
为了与数据库进行交互,我们需要获得其句柄。会话对象是数据库的句柄。会话类是用 sessionmaker() 定义的 ,这是 一个可配置的会话工厂方法,它被绑定到引擎对象上。
接下来,我们需要一个声明性的基类,在声明性系统中存储一个类和映射表的目录。
Books , Base 的一个子类,被映射到数据库中的一个 书表 。 Books 类中的属性与目标表中的列的数据类型相对应。请注意,id属性与书表中的主键相对应。
create_all() 方法在数据库中创建了相应的表。
我们现在必须声明一个Pydantic模型,它对应于声明性的基类(上面定义的Books类)。
注意配置类中 orm_mode=True 的使用,表明它与SQLAlchemy的ORM类进行了映射。
其余的代码与内存中的CRUD操作相似,不同的是操作函数通过SQLalchemy接口与数据库交互。FastAPI应用程序对象上的POST操作定义如下
首先建立一个数据库会话。来自POST请求体的数据被作为新的行添加到book表中。执行 add_book() 操作函数,将样本数据添加到book表中。为了验证,你可以使用SQLiteStudio,一个用于SQLite数据库的GUI工具。
为GET操作定义了两个操作函数,一个用于获取所有记录,另一个用于获取与路径参数相匹配的记录。
以下是绑定到/list路由的 get_books() 函数。当执行时,它的服务器响应是所有记录的列表。
/book/{id} 路由调用 get_book() 函数,id为路径参数。SQLAlchemy的查询返回一个与给定id对应的对象。
下图显示了从Swagger用户界面执行 get_books() 函数的结果。
更新和删除操作由 update _book() 函数(当访问 /update/{id} 路由时执行)和 del_book() 函数(当路由 /delete/{id} 作为URL时调用)完成。
如果你打算使用任何其他数据库来代替SQLite,你只需要相应地改变方言定义。例如,要使用MySQL数据库和 pymysql 驱动,请将引擎对象的声明改为以下内容