9.8 数据库连接池配置
Python FastAPI入门教程:快速上手Web开发与数据库连接池配置
本教程面向有Python基础的初学者,无Web开发经验。通过简单易懂的步骤和生活化类比,快速掌握FastAPI基础,包括创建Web应用、处理请求,并介绍数据库连接池配置,帮助建立信心并实现成功时刻。
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}
运行并测试:
- 保持应用运行(如果已停止,重新运行
uvicorn main:app --reload)。 - 打开
http://localhost:8000/docs,这是自动生成的API文档页面。 - 在文档中,尝试调用
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]
运行并测试:
- 确保应用运行(
uvicorn main:app --reload)。 - 在API文档页面(
http://localhost:8000/docs),调用POST /items/添加数据,然后调用GET /items/查看所有数据。
成功时刻: 你会看到数据被成功存储和检索。例如,添加一个物品后,GET请求返回列表包含它。这表明你配置的数据库连接池正在高效工作!
第五步:总结和下一步
恭喜!你已经完成了FastAPI入门教程,学会了:
- 创建基本Web应用并运行。
- 添加端点处理GET和POST请求。
- 配置数据库连接池,优化性能。
生活化回顾: FastAPI就像你的餐厅,端点是菜单,数据库是库存系统,连接池让库存管理更流畅。
下一步建议:
- 扩展应用,添加更多端点(如更新、删除物品)。
- 学习错误处理和验证。
- 探索FastAPI的其他功能,如异步支持、WebSockets。
记住,实践是最好的老师。多尝试修改代码,享受Web开发的乐趣!