一、ORM简介
在实际项目中,肯定会用到数据库对一些数据进行持久化存储,就需要用到数据库了。Python 有许多现有和成熟的 ORM,不幸的是,它们的设计方式与 I/O 处理方式相反。 是相对较新的技术,具有不同的并发模型,最大的变化是关于 I/O 的处理方式。FastApi作为一个异步Web框架,如果使用同步数据库,很明显不能把性能发挥到极致,所以这里推荐使用Tortise。
二、基本使用
官方文档:https://tortoise.github.io/
Tortoise ORM 是一个易于使用的 ORM(对象关系映射器),灵感来自 Django
1.python库安装
使用mysql数据库为例,需要安装下面两个库
pip install tortoise-orm
pip install "tortoise-orm[asyncmy]"
2.环境配置
- 先创建一个mysql的database ,名字叫 falearn
CREATE DATABASE falearn CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 在common/settings.py中进行配置
# ############## 数据库的配置信息 ###############
DATABASE = {
'host': 'localhost',
'port': 3306,
# 自己的用户
'user': 'root',
# 自己的密码
'password': 'xxxxx',
'database': 'falearn',
}
# ############## 项目中的所以应用的models ###############
INSTALLED_APPS = [
'apps.users.models',
]
# ############## tortoise的基本配置 ###############
TORTOISE_ORM = {
'connections': {
'default': {
'engine': 'tortoise.backends.mysql',
'credentials': DATABASE
},
},
'apps': {
'models': {
'models': ['aerich.models', *INSTALLED_APPS],
'default_connection': 'default',
},
}
}
- 在main.py中注册tortoise
from tortoise.contrib.fastapi import register_tortoise
from common import settings
register_tortoise(app, config=settings.TORTOISE_ORM, modules={
'models': ['models']})
3. 定义模型
字段类型
Tortoise ORM 提供了多种字段类型,以下是一些常用的字段类型:
● IntField: 整数字段
● CharField: 字符字段
● TextField: 文本字段
● BooleanField: 布尔字段
● DateField: 日期字段
● DatetimeField: 日期时间字段
● FloatField: 浮点数字段
简单定义一个基础的User模型类
在apps每个项目自己的models文件中,定义各自的模型类(也就是数据库中的表),
# apps/users/models.py
from tortoise import models, fields
class Users(models.Model):
id = fields.IntField(primary_key=True)
username = fields.CharField(max_length=255, description="用户名", unique=True)
password = fields.CharField(max_length=255, description="密码")
email = fields.CharField(max_length=255, description="邮箱", default="")
mobile = fields.CharField(max_length=255, description="手机号", default="")
is_active = fields.BooleanField(default=True, description="是否激活")
is_superuser = fields.BooleanField(default=False, description="是否超级管理员")
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
注意:每次定义后,都需要在settings中的INSTALLED_APPS
添加
INSTALLED_APPS = [
'apps.users.models',
]
4. 数据库迁移
建议使用 Aerich
pip install aerich
迁移命令:
- 在项目根目录下运行以下命令:
aerich init -t common.settings.TORTOISE_ORM
- app.TORTOISE_ORM 是 Tortoise ORM 的配置路径。例如,如果 Tortoise 配置在 main.py 中,配置路径可以是
main.TORTOISE_ORM。
- 执行完成后会生成迁移目录和一个迁移配置文件
- 生成迁移文件,初始化 数据库:
aerich init-db
执行完成后,将会生成迁移文件
可以看到Users表创建成功
ps:如果后续对表模型进行了修改,那么需要先执行下面的命令生成迁移文件,再进行迁移
# 先执行命令生成迁移文件
aerich migrate
# 再执行命令迁移
aerich upgrade
三、Tortoise ORM 模型的语法(🌟)
1. 基础增删差改
添加数据
create():
添加新数据到数据库
之前已经创建了一个用户模型对象,现在写一个接口,用于添加用户
- 创建pydatic模型
在注册时,预期接收用户名, 密码,邮箱,手机号。如果全部写在api接口定义def register(username,passwrod,email,phone):
就会显得很冗余,参数再多一些就更难写了。
所以定义一个pydatic类型,界面看起来就会更美观一些。
# users/schemas.py
from pydantic import BaseModel, Field
class RegisterForm(BaseModel):
username: str = Field(description="用户名", min_length=4, max_length=15)
password: str = Field(description="密码", min_length=6, max_length=18)
email: str = Field(description="邮箱")
mobile: str = Field(description&