FastAPI 快速开发 Web API 项目学习笔记

  • 第一篇:经过 Python FastAPI 开发一个快速的 Web API 项目

  • 第二篇:FastAPI 的路由介绍与运用

  • 第三篇:FastAPI 开发中数据校验利器 Pydantic 介绍与集成运用

  • 第四篇:FastAPI 快速开发 Web API 项目: 途径参数和查询参数

  • 第五篇:从 Flask 转换到 FastAPI(翻译)

  • 第六篇:FastAPI 快速开发 Web API 项目: 呼应模型与错误处理

  • 第七篇:FastAPI 快速开发 Web API 项目: 模板和 Jinja 介绍

介绍

FastAPI 不要求咱们强制运用 SQL(联系)数据库。因而,咱们能够依据需求运用任何联系数据库,例如:

  • PostgreSQL
  • MySQL
  • SQLite
  • Oracle
  • Microsoft SQL Server

这篇文章以 MySQL 为例,首要需要为 MySQL 装置 Python 库,FastAPI 需要运用 Python 的 MySQL 客户端库来衔接到 MySQL 数据库,这些驱动包括 mysql-connector-pythonpymysql

装置这些库:

pip install mysql-connector-python pymysql

装置成功如图所示:

FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库

用于界说 FastAPI 依靠项的 Python 文件名没有特定的命名约定。 一般,最好运用与应用程序的功用和人物匹配的称号命名,包括界说 FastAPI 依靠项的函数的 Python 文件。

在终端中,运行以下指令以在 MySQL 数据库中创立数据库 example_db

//Login to MySQL
mysql -u root -p
//Create database named example_db
CREATE DATABASE example_db;

FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库

创立数据库表 users

CREATE TABLE
  `users` (
    `id` int unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb3

往数据库表中插入一条数据:

INSERT INTO users (name) VALUES ("Atom");

db.py 文件

例如,一般命名一个包括依靠项函数的 Python 文件,该函数界说与上面示例中所示的 MySQL 数据库的衔接,以指示它具有与数据库相关的功用,例如 db.pydatabase.py

此外,如果您有多个界说 FastAPI 依靠项的函数,或者如果您为不同功用界说了依靠项,则能够经过为每个功用指定不同的称号来进步代码的可读性。

例如,请考虑以下文件名:

  • db.py:包括界说与 MySQL 数据库衔接的依靠项的文件。
  • auth.py:界说与身份验证相关的依靠项的文件。
  • validation.py:界说验证输入数据的依靠项的文件。

依据项目的巨细和结构,您还能够设计目录和模块的层次结构。 经过将包括界说依靠项的函数的 Python 文件放置在恰当的目录中并将它们安排为模块,能够改善代码管理和可维护性。

将 MySQL 客户端库添加到 FastAPI 依靠项:运用 FastAPI 依靠项将 MySQL 客户端库添加到您的应用程序。 例如,如果运用 mysql-connector-python,请按如下方式添加依靠项:

$touch routers/db.py

然后在 db.py 中写入如下代码:

from fastapi import Depends
import mysql.connector
def get_db_connection():
    connection = mysql.connector.connect(
        host='localhost',
        port=3306,
        user="root",
        password="123456",
        database="example_db"
    )
    return connection
def get_db():
    connection = get_db_connection()
    db = connection.cursor()
    try:
        yield db
    finally:
        db.close()
        connection.close()

db_router 文件

在路由器上运用 MySQL 数据库:要将 MySQL 数据库与 FastAPI 的路由器一起运用,请运用上面界说的 get_db() 函数作为依靠项。 下面是在 FastAPI 的路由器中运用 MySQL 数据库的示例。

在将 MySQL 数据库与 FastAPI 路由器一起运用的示例 Python 文件名中,一般最好依据应用程序的功用和人物对其进行命名。 你能够想到这样的文件名:

  • main.py:包括示例代码的文件,该示例是应用程序的主要入口点,界说 FastAPI 路由器并运用 MySQL 数据库。
  • router.py:界说 FastAPI 路由器并包括运用 MySQL 数据库的示例的代码的文件。
  • db.py:包括用于衔接和查询 MySQL 数据库的函数的文件。

依据项目的巨细和结构,您还能够设计目录和模块的层次结构。 例如,您能够经过创立名为路由器的目录,在其中创立界说 FastAPI 路由器的模块,并在其中包括运用 MySQL 数据库的示例代码来进步代码安排和可读性。

例如,能够考虑以下文件名和目录结构:

  • main.py:作为应用程序主入口点的文件,导入并运用路由器目录中的路由器模块。
  • routers/db_router.py:界说运用 MySQL 数据库的示例路由器的模块。
  • routers/db.py:界说用于衔接和查询MySQL数据库的函数的模块。

db_router.py 文件写入如下内容:

from fastapi import FastAPI, Depends
from mysql.connector import cursor
from db import get_db
import json
app = FastAPI()
# def get_db(db: cursor.MySQLCursor = Depends(get_db)):
#     return db
@app.get("/users/")
async def get_users(db: cursor.MySQLCursor = Depends(get_db)):
    query = "SELECT * FROM users"
    db.execute(query)
    result = db.fetchall()
    if result:
        return {"users": result}
    else:
        return {"error": "User not found"}
@app.get("/users/{user_id}")
async def get_user(user_id: int,
                   db: cursor.MySQLCursor = Depends(get_db)):
    query = "SELECT * FROM users WHERE id = %s"
    db.execute(query, (user_id,))
    result = db.fetchall()
    if result:
        return {"user_id": result[0][0], "username": result[0][1]}
    else:
        return {"error": "User not found"}
@app.get("/user_name/{user_name}")
async def insert_user(user_name: str,
                      db: cursor.MySQLCursor = Depends(get_db)):
    query = "INSERT INTO users (name) VALUES (%s)"
    db.execute(query, (user_name,))
    result = db.fetchone()
    db.execute("COMMIT")
    return {"user_name": user_name}

启动 FastAPI 服务

uvicorn db_router:app --reload
INFO:     Will watch for changes in these directories: ['/Users/sharland/dev/fastapi/MySQL/routers']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [60501] using WatchFiles
INFO:     Started server process [60503]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

当您在浏览器中拜访http://127.0.0.1:8000/docs时,将显现一个屏幕,答应您运用 GUI 操作快速 API 服务。

FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库

拜访 http://127.0.0.1:8000/users/,能够获取当时数据库中的所有用户数据:

"users":[[1,"Atom","2023-04-20T13:14:00"],[2,"Nuoza","2023-04-20T13:14:20"]]}

当拜访 http://127.0.0.1:8000/users/1 时,结果:

{"user_id":1,"username":"Atom"}

新增一个用户,http://127.0.0.1:8000/user_name/Dole。操作如图:

FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库

总结

本文总结了经过 MySQL 驱动衔接 Python, 实现了一个 FastAPI 衔接 MySQL 数据库的示例, 并结合代码结构设计了目录结构和实现了获取用户和添加用户的功用,可是本文仅仅简单运用了原生的 MySQL,其实 FastAPI 支持结合 SQLAlchemy 更方面创立模型的数据库语句,今后会持续沿用这个示例写用户的登录和注册功用, 敬请期待。

希望本文能对你有所帮助,如果喜爱本文,能够点个重视。

下一篇文章见!宇宙古今无有穷期,终身不过须臾,当思奋争。

参考链接:

  • 官方文档:SQL (Relational) Databases
  • Server-side rendering with FastAPI and MySQL
  • Create REST API to perform CRUD Operations using FastAPI and MySQL

本文正在参与「金石方案」