FastAPI 教程

9.8 数据库连接池配置

Python FastAPI入门教程:快速上手Web开发与数据库连接池配置

FastAPI 教程

本教程面向有Python基础的初学者,无Web开发经验。通过简单易懂的步骤和生活化类比,快速掌握FastAPI基础,包括创建Web应用、处理请求,并介绍数据库连接池配置,帮助建立信心并实现成功时刻。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Python FastAPI入门教程:从零开始Web开发

什么是FastAPI?

FastAPI是一个现代的Python Web框架,专为快速构建API而设计。想象一下,它就像一家高效的餐厅——顾客(客户端)通过菜单(端点)点菜(请求),厨房(服务器)快速准备并上菜(响应),整个过程简单又快速。

为什么选择FastAPI?

  • 易于学习和使用,适合初学者。
  • 性能高,响应迅速。
  • 自动生成API文档。

在本教程中,你将通过动手实践,逐步创建一个简单的Web应用,并学习如何配置数据库连接池,就像银行有多个柜台窗口(连接)来处理顾客(请求)一样,提高效率。

前置知识

假设你熟悉基础Python语法(如变量、函数、列表),但没有Web开发经验。别担心,我们会一步步来!

第一步:安装和设置

首先,确保安装了Python(建议版本3.7+)。然后,打开终端或命令行,运行以下命令安装FastAPI和一个轻量级服务器Uvicorn。

pip install fastapi uvicorn

这就像准备厨房工具——没有它们,你就没法开始做饭。

成功时刻: 安装完成后,你会看到一个确认信息。恭喜!你已经迈出了第一步。

第二步:创建第一个FastAPI应用

在项目目录中,创建一个新文件main.py,并添加以下代码。

# main.py
from fastapi import FastAPI

app = FastAPI()  # 创建一个FastAPI实例,就像开业一家餐厅

@app.get("/")  # 定义一个GET端点,就像菜单上的第一道菜
async def read_root():
    return {"message": "Hello, FastAPI!"}

解释:

  • FastAPI() 初始化应用。
  • @app.get("/") 装饰器告诉FastAPI,当有人访问根路径(如 http://localhost:8000/)时,运行下面的函数。
  • async def read_root(): 定义一个异步函数,返回一个JSON响应。

现在,运行应用:

uvicorn main:app --reload
  • main:app 指定应用文件(main.py)和应用实例(app)。
  • --reload 启用热重载,修改代码后自动重启,方便调试。

成功时刻: 在浏览器中打开 http://localhost:8000/,你会看到 {"message": "Hello, FastAPI!"}。太棒了!你的第一个Web应用运行起来了。

第三步:添加更多端点,处理请求

让我们添加一些功能。想象一下,餐厅的菜单上增加新菜品。

修改main.py,添加一个POST端点来接收数据:

# main.py
from fastapi import FastAPI
from pydantic import BaseModel  # 用于数据验证,就像检查顾客点单是否合理

app = FastAPI()

# 定义一个数据模型
class Item(BaseModel):
    name: str
    price: float

@app.get("/")  
async def read_root():
    return {"message": "Hello, FastAPI!"}

@app.get("/items/{item_id}")  # 路径参数,像菜单上的特定菜号
async def read_item(item_id: int, q: str = None):  # 查询参数可选
    return {"item_id": item_id, "q": q}

@app.post("/items/")  # POST端点,接收数据
async def create_item(item: Item):  # 使用数据模型验证输入
    return {"received": item.name, "price": item.price}

运行并测试:

  1. 保持应用运行(如果已停止,重新运行 uvicorn main:app --reload)。
  2. 打开 http://localhost:8000/docs,这是自动生成的API文档页面。
  3. 在文档中,尝试调用 POST /items/ 端点,输入JSON数据如 {"name": "Pizza", "price": 9.99}

成功时刻: 你会看到响应 {"received": "Pizza", "price": 9.99}。这表明你成功接收并处理了数据!

第四步:介绍数据库连接池配置

现在,我们来添加数据库功能,就像餐厅需要存储菜单和订单。数据库连接池是一种优化技术,预先建立多个数据库连接并复用它们,避免频繁开关连接带来的开销。类比一下:银行有多个柜台窗口(连接池),顾客(请求)来了就直接使用空闲窗口,而不是每次都要新开一个。

我们将使用SQLAlchemy(一个流行的Python SQL工具包)和SQLite数据库(简单,无需额外安装)。

安装SQLAlchemy和相关库

pip install sqlalchemy

创建数据库连接和模型

在项目目录中,创建新文件database.py

# database.py
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 数据库URL,使用SQLite,文件名为test.db
DATABASE_URL = "sqlite:///./test.db"  # 就像指定银行地址

# 创建引擎,配置连接池
# 连接池参数:pool_size 设置连接数量,max_overflow 允许超出数量
engine = create_engine(
    DATABASE_URL,
    connect_args={"check_same_thread": False},  # SQLite特定参数
    pool_size=5,  # 连接池大小,类似银行有5个柜台窗口
    max_overflow=10,  # 允许额外连接,高峰时可临时增加窗口
    pool_pre_ping=True  # 自动检查连接是否有效
)

# 创建SessionLocal,用于数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 声明基类,用于定义数据模型
Base = declarative_base()

# 定义一个简单的数据模型
class ItemDB(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    price = Column(Integer)

# 创建数据库表(只在第一次运行)
Base.metadata.create_all(bind=engine)

解释:

  • create_engine() 创建数据库连接引擎,配置了连接池参数,提高效率。
  • SessionLocal 是一个工厂,用于创建数据库会话。
  • ItemDB 是一个数据模型,对应数据库中的表。

在FastAPI应用中使用数据库

修改main.py,集成数据库操作:

# main.py
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy.orm import Session
from database import SessionLocal, ItemDB

app = FastAPI()

# 依赖函数,获取数据库会话
def get_db():
    db = SessionLocal()  # 从连接池获取一个会话
    try:
        yield db  # 提供会话给端点使用
    finally:
        db.close()  # 使用后关闭,释放回连接池

class Item(BaseModel):
    name: str
    price: float

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

@app.post("/items/")
async def create_item(item: Item, db: Session = Depends(get_db)):  # 依赖注入数据库会话
    db_item = ItemDB(name=item.name, price=int(item.price))  # 创建数据库对象
    db.add(db_item)  # 添加到会话
    db.commit()  # 提交到数据库
    db.refresh(db_item)  # 刷新以获取id
    return {"id": db_item.id, "name": db_item.name, "price": db_item.price}

@app.get("/items/")
async def read_items(db: Session = Depends(get_db)):  # 获取所有物品
    items = db.query(ItemDB).all()  # 查询数据库
    return [{"id": item.id, "name": item.name, "price": item.price} for item in items]

运行并测试:

  1. 确保应用运行(uvicorn main:app --reload)。
  2. 在API文档页面(http://localhost:8000/docs),调用 POST /items/ 添加数据,然后调用 GET /items/ 查看所有数据。

成功时刻: 你会看到数据被成功存储和检索。例如,添加一个物品后,GET请求返回列表包含它。这表明你配置的数据库连接池正在高效工作!

第五步:总结和下一步

恭喜!你已经完成了FastAPI入门教程,学会了:

  • 创建基本Web应用并运行。
  • 添加端点处理GET和POST请求。
  • 配置数据库连接池,优化性能。

生活化回顾: FastAPI就像你的餐厅,端点是菜单,数据库是库存系统,连接池让库存管理更流畅。

下一步建议:

  • 扩展应用,添加更多端点(如更新、删除物品)。
  • 学习错误处理和验证。
  • 探索FastAPI的其他功能,如异步支持、WebSockets。

记住,实践是最好的老师。多尝试修改代码,享受Web开发的乐趣!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包