介绍
FastAPI是一个非常快速的(高性能)框架,具有简单易用的API设计和自动文档生成功能。在开发Web应用程序时,ORM(对象关系映射器)通常用于操作数据库,而FastAPI也支持ORM。
在本教程中,我们将学习如何在FastAPI中使用ORM库进行数据库操作。
安装ORM库
在使用ORM之前,需要先安装ORM库。常用的ORM库有SQLAlchemy和Tortoise-ORM,本教程将使用Tortoise-ORM。
使用pip命令安装Tortoise-ORM:
pip install tortoise-orm
连接数据库
在使用ORM之前,需要在FastAPI应用程序中进行数据库连接。我们可以使用databases来支持多种数据库(如PostgreSQL,MySQL,SQLite等)。在本教程中,我们将使用SQLite作为示例数据库。
我们需要先创建一个数据库,SQLite数据库可以使用以下命令创建:
sqlite3 example.db
然后在FastAPI应用程序中添加以下代码以进行数据库连接:
from fastapi import FastAPI
from tortoise import Tortoise
app = FastAPI()
# 配置Tortoise-ORM数据库连接
Tortoise.init_app(
app,
db_url='sqlite://example.db',
modules={'models': ['app.models']}
)
创建模型
在ORM中,模型表示数据库中的表。在创建模型之前,我们需要定义表中的列以及每列数据类型,这可以通过在Tortoise-ORM的字段中定义完成。
在FastAPI应用程序中,我们需要在app/models.py文件中创建模型。
例如,我们可以创建一个名为User的模型来表示用户:
from tortoise import fields
from tortoise.models import Model
class User(Model):
id = fields.IntField(pk=True)
username = fields.CharField(max_length=50, unique=True)
password = fields.CharField(max_length=50)
full_name = fields.CharField(max_length=100)
email = fields.CharField(max_length=100)
def __str__(self):
return self.username
在上面的代码中,我们创建了一个名为User的模型,并定义了它有5个列:id,username,password,full_name和email。其中,id是主键,username是唯一的,密码等需要进行加密处理。
创建数据
在FastAPI中,我们可以使用Pydantic模型来验证并处理HTTP请求中的数据,然后使用Tortoise-ORM模型来创建数据库中的数据。
例如,我们可以创建一个名为create_user的API路由来创建用户:
from fastapi import FastAPI, HTTPException
from app.models import User
from app.schemas import UserCreate
from tortoise.contrib.fastapi import HTTPNotFoundError
from tortoise.exceptions import IntegrityError
from tortoise.transactions import in_transaction
app = FastAPI()
@app.post('/users', response_model=User)
async def create_user(user: UserCreate):
try:
async with in_transaction() as conn:
user_obj = await User.create(**user.dict(exclude_unset=True))
await conn.commit()
except IntegrityError:
raise HTTPException(status_code=409, detail='Username already exist')
return user_obj
@app.exception_handler(HTTPNotFoundError)
async def not_found_exception_handler(request, exc):
return JSONResponse(status_code=404, content={'message': 'Not found'})
在上面的代码中,我们使用async with in_transaction() as conn来启用数据库事务,这可以确保如果在创建用户时发生任何错误,就不会向数据库中写入任何数据。
Pydantic模型
我们还需为用户模型定义一个用于验证和处理HTTP请求中数据的Pydantic模型,为此,我们需要再创建一个名为UserCreate的类。
from pydantic import BaseModel
class UserCreate(BaseModel):
username: str
password: str
full_name: str
email: str
class Config:
orm_mode = True
在上面的代码中,我们定义了一个用户创建模型(UserCreate),它包含数据验证规则和ORM模型配置,可以生成JSON格式数据,ORM模型自定义JSON格式数据转换。
读取数据
最基本的读取数据的方式是使用ORM模型中的.all()方法来查询所有数据,例如,我们可以为用户模型创建一个名为read_users的API路由来获取所有用户:
@app.get('/users', response_model=List[User])
async def read_users():
return await User.all()
在上面的代码中,我们使用ORM模型中的.all()方法来查询所有用户数据,并将结果返回。
筛选数据
我们还可以使用ORM模型中的.filter()方法来筛选数据。例如,我们可以为用户模型创建一个名为read_user_by_username的API路由来按用户名获取用户:
@app.get('/users/{username}', response_model=User)
async def read_user_by_username(username: str):
return await User.filter(username=username).first()
在上面的代码中,我们使用ORM模型中的.filter()方法来按用户名筛选用户数据,并返回第一个结果。
更新数据
要更新数据,我们可以使用ORM模型中的.save()方法。例如,我们可以为用户模型创建一个名为update_user的API路由来更新用户数据:
@app.put('/users/{username}', response_model=User)
async def update_user(username: str, user: UserCreate):
user_obj = await User.filter(username=username).first().update(**user.dict(exclude_unset=True))
return user_obj
在上面的代码中,我们先根据用户名筛选用户数据,再使用update()方法将数据更新。最后返回更新后的用户数据。
删除数据
要删除数据,我们可以使用ORM模型中的.delete()方法。例如,我们可以为用户模型创建一个名为delete_user的API路由来删除用户数据:
@app.delete('/users/{username}', response_model=dict)
async def delete_user(username: str):
deleted_count = await User.filter(username=username).delete()
return {'deleted_count': deleted_count}
在上面的代码中,我们根据用户名筛选用户数据,并使用delete()方法删除。最后返回已删除记录的数量。
总结
本教程介绍了如何在FastAPI中使用Tortoise-ORM进行数据库操作。我们学习了如何连接数据库、创建模型、创建数据、读取数据、更新数据和删除数据。这些技能可以让我们更好地为Web应用程序开发提供ORM技术支持和数据库操作。