自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā)
Tortoise-ORM 是一款 輕量級(jí)、異步、易上手 的 Python ORM,適用于 FastAPI、Sanic、Tornado 等異步 Web 框架。

你是否遇到這些問題?

  • 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

?? 依賴 async 擴(kuò)展

? 復(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í)成本低!

責(zé)任編輯:趙寧寧 來源: Ssoul肥魚
相關(guān)推薦

2020-01-02 16:30:02

Spring BootJava異步請求

2021-08-13 05:50:01

ContainerdDockerKubernetes

2024-01-09 08:24:47

JMM核心線程

2021-03-28 18:40:02

LinuxWindowsJava

2021-10-25 16:01:01

Linux設(shè)備樹字符串

2023-07-14 08:00:00

ORMRust ORMSQL

2019-09-23 10:51:14

JavaJava虛擬機(jī)Linux

2025-04-03 08:30:00

Python數(shù)據(jù)庫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

微服務(wù)

2021-10-06 20:23:08

Linux共享內(nèi)存

2023-03-31 13:01:31

PythonCelery驗(yàn)證

2022-04-15 08:03:41

SaaS應(yīng)用管理市場

2021-04-19 17:32:34

Java內(nèi)存模型

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測數(shù)據(jù)變化

2021-09-15 06:55:34

異步LinqC#

2021-04-02 06:17:10

大數(shù)加減乘除數(shù)據(jù)結(jié)構(gòu)算法

2019-11-24 19:17:06

MySQL異步復(fù)制全同步復(fù)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)