当前位置: 首页 > news >正文

FastAPI 的 ORM 生态

0

文章目录

  • 一、 FastAPI 的 ORM 生态
      • ORM介绍
        • 工作原理
        • 优点
        • 缺点
      • ORM工具介绍
        • **选型建议**
  • 二、Tortoise-ORM配置
      • 为什么选择 Tortoise-ORM
      • 环境配置
      • 配置数据库连接
      • 配置说明
      • 初始化 FastAPI 应用
  • 三、Aerich 迁移工具的使用
      • Aerich 初始化
      • 生成和应用迁移
      • 模型案例
  • 四、Tortoise-ORM 的模型定义
      • 模型定义基础
      • 基本模型示例
      • 说明
      • 核心字段类型详解
        • 字段参数详解
        • 模型元数据(Meta 类)
  • 📌持续更新中
  • ✒️总结

一、 FastAPI 的 ORM 生态

ORM介绍

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在面向对象编程语言和关系型数据库之间建立映射。它允许开发者通过操作对象的方式来与数据库进行交互,而无需直接编写复杂的 SQL 语句。主要特点包括:

  1. 对象与数据库表的映射:ORM 将数据库中的表映射为编程语言中的类,每一行数据对应一个对象,表的列对应对象的属性
  2. 简化数据库操作:开发者可以使用面向对象的方法(如创建、查询、更新、删除对象)来操作数据库,而无需手动编写 SQL
  3. 跨数据库兼容:ORM 通常支持多种数据库(如 MySQL、PostgreSQL、SQLite),通过统一的接口减少数据库切换的成本
  4. 提高开发效率:通过自动化 SQL 生成和查询优化,减少重复代码,提升开发速度
工作原理
  • ORM 框架定义了一个映射层,将类和数据库表关联起来
  • 开发者通过 ORM 的 API 操作对象,ORM 自动将操作翻译成 SQL 语句,执行数据库操作并返回结果
优点
  • 提高代码可读性和维护性
  • 减少直接 SQL 操作带来的错误。
  • 支持复杂查询和关系(如一对多、多对多)
缺点
  • 性能可能略低于原生 SQL(因抽象层开销)
  • 对于非常复杂的查询,可能需要直接编写 SQL

ORM工具介绍

  • SQLAlchemy(同步/异步):≈80% 企业项目首选,功能完备、社区成熟,支持复杂查询和事务管理。
  • Tortoise(异步):语法类似 Django ORM,适合异步优先项目,集成简便
  • GINO(异步):轻量级,基于 SQLAlchemy Core 的异步扩展,适合高性能 API
选型建议
  • 传统企业项目 →SQLAlchemy(成熟稳定)
  • 全异步微服务 →Tortoise-ORMGINO

提示

FastAPI无官方 ORM

二、Tortoise-ORM配置

为什么选择 Tortoise-ORM

  • 异步支持,与 FastAPI 无缝集成
  • 简单易用的模型定义,类似 Django ORM
  • 支持复杂关系(一对一、一对多、多对多)
  • 自动生成表结构,适合快速开发

环境配置

安装必要的依赖:

pipinstalltortoise-orm==0.25.0aerich==0.9.0aiomysql==0.2.0tomlkit==0.13.2

配置数据库连接

Tortoise-ORM 需要一个配置字典来定义数据库连接信息,通常存储在 settings.py 或类似的配置文件中。

fromtypingimportDict# Tortoise-ORM 配置TORTOISE_ORM:Dict={"connections":{# 开发环境使用 SQLite(基于文件,无需服务器)"default":"sqlite://db.sqlite3",# 生产环境示例:PostgreSQL# "default": "postgres://user:password@localhost:5432/dbname",# 生产环境示例:MySQL# "default": "mysql://user:password@localhost:3306/dbname",},"apps":{"models":{"models":["app.models","aerich.models"],# 模型模块和 Aerich 迁移模型"default_connection":"default",}},# 连接池配置(推荐)"use_tz":False,# 是否使用时区"timezone":"UTC",# 默认时区"db_pool":{"max_size":10,# 最大连接数"min_size":1,# 最小连接数"idle_timeout":30# 空闲连接超时(秒)}}

配置说明

  • connections:定义数据库连接字符串
    • SQLite:sqlite://db.sqlite3(开发环境,文件存储在项目根目录)
    • PostgreSQL:postgres://user:password@host:port/dbname(生产环境)
    • MySQL:mysql://user:password@host:port/dbname(生产环境)
  • apps:定义应用模块,models 列表包含模型文件路径和 Aerich 的迁移模型
  • db_pool:连接池参数,优化数据库连接管理,适合高并发场景
  • use_tztimezone:控制时间字段的时区行为(生产环境建议启用)

初始化 FastAPI 应用

fromfastapiimportFastAPIfromtortoise.contrib.fastapiimportregister_tortoisefromapp.core.configimportTORTOISE_ORM app=FastAPI(title="FastAPI with Tortoise-ORM")# 注册 Tortoise-ORMregister_tortoise(app,config=TORTOISE_ORM,generate_schemas=True,# 开发环境自动生成表结构add_exception_handlers=True,# 添加默认异常处理器)@app.get("/")asyncdefroot():return{"message":"Welcome to FastAPI with Tortoise-ORM!"}

三、Aerich 迁移工具的使用


Aerich 是 Tortoise-ORM 的数据库迁移工具,用于管理数据库结构的变更

Aerich 初始化

在项目根目录运行以下命令:

aerich init-tmain.TORTOISE_ORM

这将生成:

  • pyproject.toml:Aerich 配置文件,指定迁移配置。
  • migrations/:迁移文件目录,存放生成的 .sql 文件。
aerich init-db

生成和应用迁移

  1. 生成迁移文件: 当模型发生变更时,运行以下命令生成迁移文件:

    aerich migrate--name"info"
  2. 应用迁移: 运行以下命令将迁移应用到数据库:

    aerich upgrade
  3. 验证迁移: 检查迁移历史

    aerichhistory
  4. 回滚迁移:回退到指定版本

    aerich downgrade

模型案例

fromtortoise.modelsimportModelfromtortoise.fieldsimportCharField,DatetimeField,BooleanFieldclassUser(Model):id=CharField(max_length=36,pk=True)# 主键,UUID 字符串username=CharField(max_length=50,unique=True)# 用户名,唯一email=CharField(max_length=255,unique=True)# 邮箱,唯一is_active=BooleanField(default=True)# 是否激活created_at=DatetimeField(auto_now_add=True)# 创建时间updated_at=DatetimeField(auto_now=True)# 更新时间classMeta:table="users"# 自定义表名ordering=["-created_at"]# 默认按创建时间降序排序def__str__(self):returnself.username

效果

fromtortoiseimportBaseDBAsyncClientasyncdefupgrade(db:BaseDBAsyncClient)->str:return""" CREATE TABLE IF NOT EXISTS `users` ( `id` VARCHAR(36) NOT NULL PRIMARY KEY, `username` VARCHAR(50) NOT NULL UNIQUE, `email` VARCHAR(255) NOT NULL UNIQUE, `is_active` BOOL NOT NULL DEFAULT 1, `created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updated_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) ) CHARACTER SET utf8mb4; CREATE TABLE IF NOT EXISTS `aerich` ( `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, `version` VARCHAR(255) NOT NULL, `app` VARCHAR(100) NOT NULL, `content` JSON NOT NULL ) CHARACTER SET utf8mb4;"""asyncdefdowngrade(db:BaseDBAsyncClient)->str:return""" """

四、Tortoise-ORM 的模型定义

模型定义基础

Tortoise-ORM 的模型通过继承 tortoise.models.Model 类定义,每个模型对应数据库中的一张表。

字段定义使用 Tortoise-ORM 提供的字段类型,结合字段参数来指定约束和行为。

基本模型示例

fromtortoise.modelsimportModelfromtortoiseimportfieldsclassUser(Model):id=fields.IntField(pk=True)# 主键字段,自动递增username=fields.CharField(max_length=50,unique=True)# 唯一用户名email=fields.CharField(max_length=100,index=True)# 带索引的邮箱created_at=fields.DatetimeField(auto_now_add=True)# 自动记录创建时间is_active=fields.BooleanField(default=True)# 账户激活状态credit=fields.DecimalField(max_digits=10,decimal_places=2,default=0.0)# 精确数值classMeta:table="auth_users"# 自定义表名ordering=["-created_at"]# 默认按创建时间倒序unique_together=['username','email']#定义联合唯一约束(如 unique_together=[("field1", "field2")])

说明

  • 继承Model:所有模型必须继承 tortoise.models.Model。
  • 字段定义:每个字段对应数据库表中的一列,使用 Tortoise-ORM 的字段类(如 CharField、BooleanField)。
  • Meta:用于定义模型的元数据,如表名、排序规则等。

核心字段类型详解

Tortoise-ORM 提供了多种字段类型,用于定义数据库列的类型和行为。以下是常用的字段类型及其典型用途:

Python 字段类型数据库类型描述常用参数
CharFieldVARCHAR字符串max_length(必填)、unique=Trueindex=True
TextFieldTEXT长文本null=True(允许为空)
IntField/BigIntFieldINTEGER/BIGINT整数pk=True(主键)、default=0
FloatFieldDOUBLE/REAL浮点数gt=0(值需大于0)
DecimalFieldDECIMAL高精度小数max_digits=10,decimal_places=2(最大10位,含2位小数)
BooleanFieldBOOLEAN布尔值default=True
DateFieldDATE日期auto_now=True(保存时更新)
DatetimeFieldDATETIME/TIMESTAMP日期时间auto_now_add=True(仅首次保存记录时间)
JSONFieldJSON/JSONB存储字典或列表encoder(自定义编码器)、decoder(自定义解码器)
UUIDFieldUUID/CHAR(36)唯一标识符若为主键默认生成 UUID4
BinaryFieldBLOB二进制数据不支持过滤或更新操作
字段参数详解

字段支持多种参数,用于定义约束、默认值和其他行为。以下是常用参数:

  • max_length:字符串字段的最大长度(CharField 必填)
  • null:是否允许字段为空(null=True 表示数据库允许 NULL)
  • default:字段默认值(如 default=0、default=True)
  • unique:是否唯一(unique=True 确保字段值在表中唯一)
  • index:是否创建索引(index=True 提高查询性能)
  • description:字段描述(用于文档或数据库注释)
  • pk:是否为主键(pk=True 表示该字段是主键)
  • validators:自定义验证函数
fromtortoise.validatorsimportValidatordefvalidate_credit(value):ifvalue<0:raiseValueError("信用值不能为负数")classUser(Model):credit=fields.IntField(validators=[validate_credit])# 自定义验证函数
模型元数据(Meta 类)

Meta 类用于定义模型的元数据,控制表结构和查询行为。常用属性包括:

  • table:自定义数据库表名(如 table=“users”)
  • unique_together:定义联合唯一约束(如 unique_together=[(“field1”, “field2”)])
  • indexes:定义索引(如 indexes=[(“field1”, “field2”)])
  • ordering:默认排序规则(如 ordering=[“-created_at”, “username”])
classEvent(Model):name=CharField(max_length=100)location=CharField(max_length=200)date=DateField()classMeta:table="events"unique_together=[("name","date")]# 名称和日期联合唯一indexes=[("location",)]# 为 location 字段创建索引ordering=["date"]# 按日期升序排序

📌持续更新中

✒️总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见

http://www.jsqmd.com/news/563435/

相关文章:

  • UE5新手避坑:蓝图里Event Tick每帧调用时,为啥老报“无访问”读取属性错误?
  • 2026汕头地道特产店推荐榜:潮汕特产茶叶、潮汕茶叶伴手礼、潮汕鸭屎香、正宗凤凰单枞、正宗鸭屎香、汕头凤凰单枞选择指南 - 优质品牌商家
  • Stable Diffusion工作流升级:Pixel Fashion Atelier预设Prompt库详解
  • 保姆级教程:用Halcon的create_caltab函数生成蜂窝标定板(附A4打印尺寸换算)
  • nginx代理多服务
  • 实测好用!雯雯的后宫-造相Z-Image-瑜伽女孩:一键部署,快速生成惊艳瑜伽女孩图片
  • fgprof自定义扩展指南:实现特定格式的性能数据输出
  • CAN总线错误帧诊断与示波器排查实战
  • Java开始
  • Wan2.2-I2V-A14B多主体协同生成:多人物/多物体交互逻辑建模技巧
  • StructBERT零样本分类-中文-base惊艳案例:‘好评/差评/物流问题’三标签精准识别
  • nginx常用基础模块
  • Ubuntu 24.04 服务器上,5分钟搞定Dify的Docker部署(含阿里云镜像加速)
  • 5步精通Atmosphere:Switch自定义固件从配置到优化全指南
  • 数据库第一次作业
  • Qwen2.5微调入门教程:基于instruction tuning实战
  • 2026年知名的十堰医养养老院/十堰失能养老院专业护理推荐 - 品牌宣传支持者
  • 探索Matlab中基于改进遗传算法的资源调度
  • 别再死记公式了!用Python仿真带你直观理解Delta-Sigma ADC的噪声整形
  • 精益管理底层逻辑全拆解!五分钟说清精益管理实操技巧
  • 数据可视化:解锁数据背后的视觉密码
  • Qwen3.5-27B部署案例:CSDN GPU云实例上开箱即用的多模态AI服务搭建
  • 从洛谷P3383到P1835:手把手教你用C++实现线性筛法,搞定大范围质数统计
  • ASMR音频资源高效管理工具:一键构建个人专属收藏库
  • Kubernetes 与大数据集成最佳实践
  • 2025_NIPS_Certifying Stability of Reinforcement Learning Policies using Generalized Lyapunov Functio
  • Fish Speech 1.5开源TTS效果展示:中文新闻播报级自然语音样例
  • ESP32-S3驱动ST7262+GT911的LVGL嵌入式GUI集成方案
  • 短信营销接口调用逻辑详解:开发者如何通过代码实现API签名与回执接收
  • 文科生逆袭AI高薪!0基础也能入行的4条黄金赛道