Python 異步 ORM 全解析,一文搞定!
你是否遇到這些問題?
- SQLAlchemy 太復(fù)雜,想找個(gè)輕量級(jí) ORM?
- 需要在 FastAPI 里操作數(shù)據(jù)庫,但 SQLAlchemy 配置繁瑣?
- 想在異步項(xiàng)目中優(yōu)雅地操作數(shù)據(jù)庫?
Tortoise-ORM 是一款 輕量級(jí)、異步、易上手 的 Python ORM,適用于 FastAPI、Sanic、Tornado 等異步 Web 框架。
本篇文章帶你 從入門到進(jìn)階,徹底掌握 Tortoise-ORM!
目錄結(jié)構(gòu)
tortoise_project/
│── main.py # 啟動(dòng)應(yīng)用,初始化數(shù)據(jù)庫
│── db.py # 負(fù)責(zé)數(shù)據(jù)庫連接
│── models.py # 定義 ORM 模型
│── crud.py # 封裝數(shù)據(jù)庫操作(增刪改查)
│── config.py # 配置數(shù)據(jù)庫信息
│── requirements.txt # 依賴包列表
代碼拆分合理,結(jié)構(gòu)清晰,方便擴(kuò)展!
安裝 & 配置
(1) 安裝依賴
pip install tortoise-orm aiosqlite
如果使用 MySQL:
pip install aiomysql
如果使用 PostgreSQL:
pip install asyncpg
(2) 配置數(shù)據(jù)庫信息(config.py)
DB_URL = "sqlite://db.sqlite3" # 這里可以改為 MySQL / PostgreSQL
這樣做的好處:方便更換數(shù)據(jù)庫類型!
(3) 連接數(shù)據(jù)庫(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() # 自動(dòng)創(chuàng)建表
ORM 需要 init() 初始化數(shù)據(jù)庫,然后 generate_schemas() 自動(dòng)建表。
定義 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" # 指定數(shù)據(jù)庫表名
ORM 方式定義表結(jié)構(gòu),避免手寫 SQL!
封裝數(shù)據(jù)庫操作(crud.py)
from models import User
# 插入數(shù)據(jù)
asyncdefcreate_user(name: str, age: int):
returnawait User.create(name=name, age=age)
# 查詢數(shù)據(jù)
asyncdefget_user(user_id: int):
returnawait User.get(id=user_id)
# 更新數(shù)據(jù)
asyncdefupdate_user(user_id: int, new_age: int):
user = await User.get(id=user_id)
user.age = new_age
await user.save()
# 刪除數(shù)據(jù)
asyncdefdelete_user(user_id: int):
user = await User.get(id=user_id)
await user.delete()
封裝 CRUD,主邏輯更清晰,調(diào)用更方便!
啟動(dòng)程序(main.py)
import asyncio
from db import init_db
from crud import create_user, get_user
asyncdefmain():
await init_db() # 連接數(shù)據(jù)庫
# 創(chuàng)建用戶
user = await create_user(name="Alice", age=25)
print(f"創(chuàng)建用戶:{user.name},ID:{user.id}")
# 查詢用戶
found_user = await get_user(user.id)
print(f"查詢用戶:{found_user.name},年齡:{found_user.age}")
# 運(yùn)行主函數(shù)
asyncio.run(main())
代碼拆分后,main.py 邏輯清晰,可隨時(shí)擴(kuò)展!
進(jìn)階操作:一對多 & 多對多
(1) 一對多關(guān)系(User → Post)
class Post(Model):
id = fields.IntField(pk=True)
title = fields.CharField(max_length=100)
user = fields.ForeignKeyField("models.User", related_name="posts") # 外鍵
ForeignKeyField 定義外鍵關(guān)系,related_name 反向訪問!
(2) 多對多關(guān)系(User ? Course)
class Course(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=100)
users = fields.ManyToManyField("models.User", related_name="courses")
多對多關(guān)系通過 ManyToManyField 輕松實(shí)現(xiàn)!
Tortoise-ORM vs 其他 ORM
ORM 框架 | 異步支持 | 輕量級(jí) | 易用性 | 適用場景 |
Tortoise-ORM | ? 原生異步 | ? 輕量級(jí) | ? 類 Django ORM | ? FastAPI / Sanic / 異步項(xiàng)目 |
SQLAlchemy | ?? 依賴 | ? 復(fù)雜 | ? API 復(fù)雜 | ? 復(fù)雜項(xiàng)目 |
Django ORM | ? 僅同步 | ?? 比較重 | ? 簡單 | ? Django 項(xiàng)目 |
- 異步項(xiàng)目 → 用 Tortoise-ORM
- 同步項(xiàng)目 → 用 Django ORM 或 SQLAlchemy
結(jié)語:Tortoise-ORM 讓異步數(shù)據(jù)庫操作更簡單!
Tortoise-ORM 是 FastAPI、Sanic 等異步 Web 框架的最佳 ORM 選擇!
語法簡單,API 直觀,學(xué)習(xí)成本低!