FastAPI-数据库和ORM(二)

2023-05-07 21:15:55 浏览数 (1)

Tortoise ORM

Tortoise ORM 是一个异步 ORM 框架,它专为 asyncio 编写。它与 SQLAlchemy 类似,提供了灵活的查询语言和完整的事务支持,但是它的重点是使用异步 I/O 进行高效的数据库访问。

使用 Tortoise ORM 连接数据库的第一步是安装 Tortoise ORM:

代码语言:javascript复制
pip install tortoise-orm

然后,需要定义一个名为 Tortoise 的全局实例,并使用它来初始化数据库连接:

代码语言:javascript复制
from tortoise import Tortoise
from tortoise.contrib.fastapi import register_tortoise

DB_URL = "sqlite://db.sqlite3"
Tortoise.init(db_url=DB_URL, modules={"models": ["app.models"]})
Tortoise.generate_schemas()

在这个示例中,我们使用的是 SQLite 数据库,并定义了一个名为 models 的 Python 模块,其中包含所有数据库模型类的定义。Tortoise.init 函数初始化数据库连接,并使用 Tortoise.generate_schemas 函数自动创建数据库表。

使用 Tortoise ORM 进行 CRUD 操作与使用 SQLAlchemy 相同。只需定义数据库模型类,然后使用 Tortoise 实例进行操作。例如,以下是一个使用 Tortoise ORM 定义用户模型的示例:

代码语言:javascript复制
from tortoise.models import Model
from tortoise import fields

class User(Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=100, unique=True)
    email = fields.CharField(max_length=100, unique=True)
    password_hash = fields.CharField(max_length=100)
    is_active = fields.BooleanField(default=True)

这个模型类定义了一个 User 类,它映射到一个名为 user 的数据库表。表中有几个列,包括 idusernameemailpassword_hashis_active

使用 Tortoise ORM 进行 CRUD 操作与使用 SQLAlchemy 相同。例如,以下代码向数据库中插入一个新用户:

代码语言:javascript复制
from tortoise.contrib.fastapi import HTTPNotFoundError
from tortoise.contrib.pydantic import pydantic_model_creator
from fastapi import APIRouter, Depends, HTTPException, status
from app.models import User
from app.schemas import UserCreate, UserOut

router = APIRouter()

user_schema = pydantic_model_creator(User)
user_create_schema = pydantic_model_creator(UserCreate, exclude_readonly=True)

@router.post("/", response_model=UserOut, status_code=status.HTTP_201_CREATED)
async def create_user(user: UserCreate, db: AsyncIOMotorClient = Depends(get_database)):
    user_obj = User(**user.dict())
    user_obj.password = get_password_hash(user_obj.password)
    await user_obj.commit()
    return await user_schema.from_tortoise_orm(user_obj)

这个路由函数定义了一个 create_user 路由,该路由接受一个 UserCreate 对象和一个 db 依赖项(该依赖项定义在 get_database 函数中),并将该用户添加到数据库中。它使用 pydantic_model_creator 函数创建一个 Pydantic 模型来序列化和反序列化数据库模型,并返回一个 UserOut 对象。

0 人点赞