Python 异步 ORM 全解析,一文搞定!

开发
Tortoise-ORM 是一款 轻量级、异步、易上手 的 Python ORM,适用于 FastAPI、Sanic、Tornado 等异步 Web 框架。

你是否遇到这些问题?

  • SQLAlchemy 太复杂,想找个轻量级 ORM?
  • 需要在 FastAPI 里操作数据库,但 SQLAlchemy 配置繁琐?
  • 想在异步项目中优雅地操作数据库?

Tortoise-ORM 是一款 轻量级、异步、易上手 的 Python ORM,适用于 FastAPI、Sanic、Tornado 等异步 Web 框架。

本篇文章带你 从入门到进阶,彻底掌握 Tortoise-ORM!

目录结构

tortoise_project/
│── main.py             # 启动应用,初始化数据库
│── db.py               # 负责数据库连接
│── models.py           # 定义 ORM 模型
│── crud.py             # 封装数据库操作(增删改查)
│── config.py           # 配置数据库信息
│── requirements.txt    # 依赖包列表
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

代码拆分合理,结构清晰,方便扩展!

安装 & 配置

(1) 安装依赖

pip install tortoise-orm aiosqlite
  • 1.

如果使用 MySQL:

pip install aiomysql
  • 1.

如果使用 PostgreSQL:

pip install asyncpg
  • 1.

(2) 配置数据库信息(config.py)

DB_URL = "sqlite://db.sqlite3"  # 这里可以改为 MySQL / PostgreSQL
  • 1.

这样做的好处:方便更换数据库类型!

(3) 连接数据库(db.py)

from tortoise import Tortoise
from config import DB_URL

async def init_db():
    await Tortoise.init(
        db_url=DB_URL,
        modules={"models": ["models"]}  # 告诉 ORM 去哪里找模型
    )
    await Tortoise.generate_schemas()  # 自动创建表
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

ORM 需要 init() 初始化数据库,然后 generate_schemas() 自动建表。

定义 ORM 模型(models.py)

from tortoise.models import Model
from tortoise import fields

class User(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=50)
    age = fields.IntField()
    created_at = fields.DatetimeField(auto_now_add=True)

    class Meta:
        table = "users"  # 指定数据库表名
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

ORM 方式定义表结构,避免手写 SQL!

封装数据库操作(crud.py)

from models import User

# 插入数据
asyncdefcreate_user(name: str, age: int):
    returnawait User.create(name=name, age=age)

# 查询数据
asyncdefget_user(user_id: int):
    returnawait User.get(id=user_id)

# 更新数据
asyncdefupdate_user(user_id: int, new_age: int):
    user = await User.get(id=user_id)
    user.age = new_age
    await user.save()

# 删除数据
asyncdefdelete_user(user_id: int):
    user = await User.get(id=user_id)
    await user.delete()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

封装 CRUD,主逻辑更清晰,调用更方便!

启动程序(main.py)

import asyncio
from db import init_db
from crud import create_user, get_user

asyncdefmain():
    await init_db()  # 连接数据库

    # 创建用户
    user = await create_user(name="Alice", age=25)
    print(f"创建用户:{user.name},ID:{user.id}")

    # 查询用户
    found_user = await get_user(user.id)
    print(f"查询用户:{found_user.name},年龄:{found_user.age}")

# 运行主函数
asyncio.run(main())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

代码拆分后,main.py 逻辑清晰,可随时扩展!

进阶操作:一对多 & 多对多

(1) 一对多关系(User → Post)

class Post(Model):
    id = fields.IntField(pk=True)
    title = fields.CharField(max_length=100)
    user = fields.ForeignKeyField("models.User", related_name="posts")  # 外键
  • 1.
  • 2.
  • 3.
  • 4.

ForeignKeyField 定义外键关系,related_name 反向访问!

(2) 多对多关系(User ↔ Course)

class Course(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=100)
    users = fields.ManyToManyField("models.User", related_name="courses")
  • 1.
  • 2.
  • 3.
  • 4.

多对多关系通过 ManyToManyField 轻松实现!

Tortoise-ORM vs 其他 ORM

ORM 框架

异步支持

轻量级

易用性

适用场景

Tortoise-ORM

✅ 原生异步

✅ 轻量级

✅ 类 Django ORM

✅ FastAPI / Sanic / 异步项目

SQLAlchemy

⚠️ 依赖 async 扩展

❌ 复杂

❌ API 复杂

✅ 复杂项目

Django ORM

❌ 仅同步

⚠️ 比较重

✅ 简单

✅ Django 项目

  • 异步项目 → 用 Tortoise-ORM
  • 同步项目 → 用 Django ORM 或 SQLAlchemy

结语:Tortoise-ORM 让异步数据库操作更简单!

Tortoise-ORM 是 FastAPI、Sanic 等异步 Web 框架的最佳 ORM 选择!

语法简单,API 直观,学习成本低!

责任编辑:赵宁宁 来源: Ssoul肥鱼
相关推荐

2020-01-02 16:30:02

Spring BootJava异步请求

2024-01-09 08:24:47

JMM核心线程

2021-10-25 16:01:01

Linux设备树字符串

2021-03-28 18:40:02

LinuxWindowsJava

2021-08-13 05:50:01

ContainerdDockerKubernetes

2023-07-14 08:00:00

ORMRust ORMSQL

2019-09-23 10:51:14

JavaJava虚拟机Linux

2025-04-03 08:30:00

Python数据库ORM

2022-06-10 09:04:24

Python读取文件代码

2022-08-17 18:25:37

Java分布式搜索引擎

2021-08-31 07:02:20

Diff算法DOM

2020-10-29 08:55:04

微服务

2021-10-06 20:23:08

Linux共享内存

2023-03-31 13:01:31

PythonCelery验证

2022-04-15 08:03:41

SaaS应用管理市场

2021-04-19 17:32:34

Java内存模型

2021-08-31 07:02:34

数据响应Vue侦测数据变化

2021-09-15 06:55:34

异步LinqC#

2021-04-02 06:17:10

大数加减乘除数据结构算法

2019-11-24 19:17:06

MySQL异步复制全同步复制
点赞
收藏

51CTO技术栈公众号