如何在FastAPI中使用ORM库进行数据操作

介绍

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技术支持和数据库操作。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签