2025 Python异步ORM终极指南:从零掌握encode/orm框架

2025 Python异步ORM终极指南:从零掌握encode/orm框架

【免费下载链接】orm An async ORM. 🗃 【免费下载链接】orm 项目地址: https://gitcode.com/gh_mirrors/orm/orm

你是否正面临这些异步数据库挑战?

作为Python开发者,你是否在异步项目中遭遇过这些痛点:

  • 手写SQL异步查询导致代码冗余混乱
  • 切换PostgreSQL/MySQL/SQLite时需重写数据访问层
  • 处理模型关系时陷入N+1查询性能陷阱
  • 数据验证与数据库操作脱节导致运行时错误

本文将彻底解决这些问题。通过系统化学习encode/orm——这个基于SQLAlchemy Core构建的异步ORM框架,你将获得一套统一的异步数据访问解决方案。无论你是异步新手还是资深开发者,读完本文后将能够:

  • 30分钟内构建生产级异步数据模型
  • 掌握10种高级查询优化技巧
  • 优雅处理一对一/一对多复杂关系
  • 实现跨数据库兼容的应用架构

为什么选择encode/orm?框架核心优势解析

encode/orm并非从零构建的全新ORM,而是站在巨人肩膀上的创新之作。它巧妙整合了三大核心组件:

mermaid

这种架构带来了独特优势:

特性encode/orm传统同步ORM原生SQL
异步支持✅ 原生异步API❌ 需额外封装⚠️ 手动处理异步逻辑
数据库兼容性✅ 一套代码支持3种数据库⚠️ 有限兼容❌ 完全不兼容
查询构建✅ 链式API+SQLAlchemy表达式✅ 链式API❌ 字符串拼接
数据验证✅ 字段级自动验证⚠️ 部分支持❌ 需手动实现
模型关系✅ 自动处理外键关系✅ 支持但同步加载❌ 手动JOIN

生产就绪度:该框架已被FastAPI等知名项目采用,每周PyPI下载量超过10万次,拥有完善的测试覆盖(代码cov 98%+)和活跃的社区支持。

快速上手:5分钟安装与基础配置

环境准备

确保你的开发环境满足:

  • Python 3.8+
  • 异步运行时(uvicorn/hypercorn)
  • 目标数据库(PostgreSQL/MySQL/SQLite)

安装命令

根据目标数据库选择对应的安装命令:

# 基础安装(无数据库驱动)
pip install orm

# PostgreSQL支持
pip install orm[postgresql]

# MySQL支持
pip install orm[mysql]

# SQLite支持
pip install orm[sqlite]

# 全数据库支持
pip install orm[postgresql,mysql,sqlite]

首次连接数据库

import databases
import orm

# SQLite连接(文件型数据库)
database = databases.Database("sqlite:///mydb.sqlite")
models = orm.ModelRegistry(database=database)

# PostgreSQL连接示例
# database = databases.Database("postgresql://user:password@localhost/dbname")

# MySQL连接示例
# database = databases.Database("mysql://user:password@localhost/dbname")

# 初始化数据库连接
async def main():
    await database.connect()
    # 执行数据库操作...
    await database.disconnect()

⚠️ 注意:生产环境中应使用连接池配置,并通过环境变量注入数据库URL,避免硬编码凭证。

核心概念:数据模型设计指南

模型定义基础

encode/orm采用声明式模型定义,每个模型对应数据库中的一张表:

import datetime
from typing import Optional

class Note(orm.Model):
    tablename = "notes"  # 数据库表名
    registry = models    # 关联的模型注册表
    fields = {           # 字段定义字典
        "id": orm.Integer(primary_key=True),
        "title": orm.String(max_length=100),
        "content": orm.Text(allow_null=True),
        "created_at": orm.DateTime(auto_now_add=True),
        "updated_at": orm.DateTime(auto_now=True),
        "priority": orm.Integer(default=0),
        "is_completed": orm.Boolean(default=False)
    }

这个简单模型包含了几个关键特性:

  • primary_key=True 标记主键字段
  • auto_now_add=True 创建时自动设置时间戳
  • auto_now=True 更新时自动刷新时间戳
  • default 设置字段默认值
  • allow_null=True 允许空值(默认禁止)

支持的字段类型全解析

encode/orm提供18种字段类型,满足各种数据存储需求:

字段类型用途说明常用参数数据库映射
Integer整数primary_key, defaultINT
BigInteger长整数primary_key, indexBIGINT
String短文本max_length, uniqueVARCHAR(max_length)
Text长文本allow_nullTEXT
Boolean布尔值default=FalseBOOLEAN
DateTime日期时间auto_now, auto_now_addDATETIME
Date日期auto_now_addDATE
Decimal高精度小数max_digits, decimal_placesDECIMAL
Float浮点数-FLOAT
Enum枚举类型enum (Python枚举类)VARCHAR/INT
UUID唯一标识符uuid_formatUUID
JSONJSON数据-JSONB (PostgreSQL)
Email邮箱地址max_lengthVARCHAR
URLURL地址max_lengthVARCHAR
IPAddressIP地址-VARCHAR
Time时间-TIME
ForeignKey外键关系model, on_deleteINT (关联主键)
OneToOne一对一关系model, on_deleteINT (唯一约束+关联主键)

高级模型配置

索引与约束
class User(orm.Model):
    tablename = "users"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "username": orm.String(max_length=50, unique=True, index=True),
        "email": orm.Email(max_length=100, unique=True),
        "age": orm.Integer(index=True),
    }
  • unique=True 创建唯一约束
  • index=True 创建普通索引
  • 联合索引需通过SQLAlchemy表对象额外定义
自定义表名与架构
class Product(orm.Model):
    tablename = "products"
    registry = models
    schema = "ecommerce"  # PostgreSQL架构支持
    fields = {
        "id": orm.Integer(primary_key=True),
        "name": orm.String(max_length=200),
    }

数据库迁移支持

encode/orm本身不包含迁移工具,但可无缝集成Alembic(SQLAlchemy的迁移工具):

# 初始化Alembic环境
alembic init migrations

# 修改alembic.ini中的数据库URL
# sqlalchemy.url = sqlite:///mydb.sqlite

# 生成迁移脚本
alembic revision --autogenerate -m "Initial migration"

# 应用迁移
alembic upgrade head

数据操作:异步CRUD完全指南

创建数据

基础创建
# 创建单条记录
note = await Note.objects.create(
    title="学习encode/orm",
    content="这是一篇关于异步ORM的笔记",
    priority=1
)
print(note.id)  # 自动生成的主键
print(note.created_at)  # 自动设置的创建时间
批量创建
# 批量创建多条记录(更高效)
notes = await Note.objects.bulk_create([
    {"title": "第一条批量笔记", "priority": 2},
    {"title": "第二条批量笔记", "content": "批量创建更节省数据库连接"},
])
print(len(notes))  # 2

查询数据

encode/orm提供了丰富的查询API,支持链式调用构建复杂查询:

基础查询
# 获取所有记录
all_notes = await Note.objects.all()

# 获取第一条记录
first_note = await Note.objects.first()

# 根据主键获取
note = await Note.objects.get(id=1)

# 条件过滤
high_priority = await Note.objects.filter(priority__gt=2).all()

# 排序
sorted_notes = await Note.objects.order_by("priority", "-created_at").all()

# 限制数量和偏移
page_notes = await Note.objects.limit(10).offset(20).all()
高级过滤

支持多种查询操作符,格式为字段名__操作符=值

# 模糊查询
contains = await Note.objects.filter(title__icontains="orm").all()

# 范围查询
in_range = await Note.objects.filter(id__in=[1,3,5,7]).all()

# 比较查询
complex = await Note.objects.filter(
    orm.And(
        Note.fields.priority >= 2,
        Note.fields.created_at > datetime.datetime(2023, 1, 1)
    )
).all()

完整操作符列表:

  • exact/iexact: 精确匹配/忽略大小写
  • contains/icontains: 包含子串
  • gt/gte: 大于/大于等于
  • lt/lte: 小于/小于等于
  • in: 在列表中
  • is_null: 是否为NULL
  • startswith/endswith: 以...开始/结束
聚合查询

通过SQLAlchemy的func模块支持聚合操作:

from sqlalchemy import func

# 计数
count = await Note.objects.count()

# 分组统计
priority_counts = await Note.objects.values("priority").annotate(
    count=func.count(Note.fields.id)
).order_by("-count")

更新数据

实例更新
note = await Note.objects.get(id=1)
await note.update(priority=3, is_completed=True)
批量更新
# 更新符合条件的所有记录
await Note.objects.filter(is_completed=False).update(priority=0)

删除数据

实例删除
note = await Note.objects.get(id=1)
await note.delete()
批量删除
# 删除符合条件的所有记录
await Note.objects.filter(priority__lt=1).delete()

# 删除所有记录(谨慎使用!)
await Note.objects.delete()

实用查询模式

存在性检查
has_high = await Note.objects.filter(priority__gt=5).exists()
高级查询链
# 复杂查询链示例
results = await Note.objects.filter(
    is_completed=False
).exclude(
    title__icontains="draft"
).order_by(
    "-priority", "created_at"
).limit(
    10
).offset(
    0
).all()
条件表达式
from sqlalchemy import case

# 使用SQL函数和条件表达式
notes = await Note.objects.annotate(
    is_high=case(
        [(Note.fields.priority > 3, True)],
        else_=False
    )
).filter(
    is_high=True
).all()

模型关系:处理关联数据的艺术

数据库设计的核心在于表之间的关系。encode/orm提供了强大的关系管理功能,支持常见的数据库关系模式。

一对多关系

最常见的关系类型,例如一个作者可以有多本书:

class Author(orm.Model):
    tablename = "authors"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "name": orm.String(max_length=100),
        "bio": orm.Text(allow_null=True),
    }

class Book(orm.Model):
    tablename = "books"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "title": orm.String(max_length=200),
        "author": orm.ForeignKey(Author, on_delete=orm.CASCADE),
        "publication_year": orm.Integer(),
    }
创建关联数据
# 创建作者
author = await Author.objects.create(name="Robert Martin")

# 创建关联书籍
await Book.objects.create(
    title="Clean Code",
    author=author,
    publication_year=2008
)
await Book.objects.create(
    title="Clean Architecture",
    author=author,
    publication_year=2017
)
查询关联数据
# 获取作者的所有书籍
author = await Author.objects.get(name="Robert Martin")
books = await Book.objects.filter(author=author).all()

# 通过外键字段过滤
recent_books = await Book.objects.filter(
    author__name="Robert Martin",
    publication_year__gt=2010
).all()
加载关联对象

默认情况下,外键字段只包含关联对象的主键。使用select_related预加载关联对象:

# 预加载作者信息(避免N+1查询问题)
books = await Book.objects.select_related("author").all()
for book in books:
    print(book.author.name)  # 无需额外查询

一对一关系

适用于实体之间的唯一对应关系,例如用户和个人资料:

class User(orm.Model):
    tablename = "users"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "email": orm.Email(max_length=100, unique=True),
    }

class Profile(orm.Model):
    tablename = "profiles"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "user": orm.OneToOne(User, on_delete=orm.CASCADE),
        "full_name": orm.String(max_length=100),
        "website": orm.URL(max_length=200, allow_null=True),
    }
使用一对一关系
# 创建用户和关联资料
user = await User.objects.create(email="user@example.com")
profile = await Profile.objects.create(
    user=user,
    full_name="John Doe",
    website="https://johndoe.com"
)

# 查询用户资料
profile = await Profile.objects.select_related("user").get(user__email="user@example.com")
print(profile.user.email)  # user@example.com

关系级联操作

外键关系支持多种级联策略,通过on_delete参数指定:

# 级联删除:删除作者时同时删除所有书籍
orm.ForeignKey(Author, on_delete=orm.CASCADE)

# 限制删除:如果有书籍引用则禁止删除作者
orm.ForeignKey(Author, on_delete=orm.RESTRICT)

# 设置为空:删除作者时将书籍的author字段设为NULL
orm.ForeignKey(Author, on_delete=orm.SET_NULL, allow_null=True)

高级特性:提升开发效率的技巧

数据验证

encode/orm内置基于typesystem的数据验证:

class Product(orm.Model):
    tablename = "products"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "price": orm.Decimal(max_digits=10, decimal_places=2),
        "stock": orm.Integer(minimum=0),  # 确保库存不为负数
        "name": orm.String(max_length=100, pattern=r"^[A-Za-z0-9\s]+$"),
    }

当尝试插入无效数据时,会立即引发验证错误:

try:
    await Product.objects.create(price=99.999, stock=-5, name="Invalid@Product")
except orm.ValidationError as e:
    print(e.detail)  # 显示详细验证错误

事务支持

使用database.transaction()上下文管理器处理事务:

async with database.transaction():
    # 所有操作在同一事务中执行
    author = await Author.objects.create(name="New Author")
    await Book.objects.create(title="Book 1", author=author)
    await Book.objects.create(title="Book 2", author=author)
    # 如果发生异常,所有更改将回滚

原始SQL查询

对于复杂查询,可直接使用原始SQL:

query = """
    SELECT a.name, COUNT(b.id) as book_count 
    FROM authors a
    LEFT JOIN books b ON a.id = b.author_id
    GROUP BY a.id
"""
results = await database.fetch_all(query=query)
for row in results:
    print(row["name"], row["book_count"])

模型方法与属性

为模型添加自定义方法和属性:

class Order(orm.Model):
    tablename = "orders"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "total": orm.Decimal(max_digits=10, decimal_places=2),
        "tax_rate": orm.Decimal(max_digits=5, decimal_places=2, default=0.08),
    }
    
    @property
    def tax_amount(self):
        """计算税额"""
        return self.total * self.tax_rate
    
    @property
    def total_with_tax(self):
        """计算含税总额"""
        return self.total + self.tax_amount
    
    @classmethod
    async def get_high_value_orders(cls, min_amount=1000):
        """获取高价值订单"""
        return await cls.objects.filter(total__gt=min_amount).all()

使用自定义方法:

orders = await Order.get_high_value_orders(500)
for order in orders:
    print(f"Order {order.id}: {order.total_with_tax}")

实战案例:构建异步博客系统

让我们通过一个完整案例展示encode/orm的实际应用——构建一个支持分类、标签和评论的异步博客系统。

数据库模型设计

class User(orm.Model):
    tablename = "users"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "username": orm.String(max_length=50, unique=True),
        "email": orm.Email(max_length=100, unique=True),
        "created_at": orm.DateTime(auto_now_add=True),
    }

class Category(orm.Model):
    tablename = "categories"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "name": orm.String(max_length=50, unique=True),
        "slug": orm.String(max_length=50, unique=True),
    }

class Post(orm.Model):
    tablename = "posts"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "title": orm.String(max_length=200),
        "slug": orm.String(max_length=200, unique=True),
        "content": orm.Text(),
        "author": orm.ForeignKey(User, on_delete=orm.CASCADE),
        "category": orm.ForeignKey(Category, on_delete=orm.SET_NULL, allow_null=True),
        "created_at": orm.DateTime(auto_now_add=True),
        "updated_at": orm.DateTime(auto_now=True),
        "is_published": orm.Boolean(default=False),
    }

class Comment(orm.Model):
    tablename = "comments"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "post": orm.ForeignKey(Post, on_delete=orm.CASCADE),
        "author": orm.ForeignKey(User, on_delete=orm.CASCADE),
        "content": orm.Text(),
        "created_at": orm.DateTime(auto_now_add=True),
    }

class Tag(orm.Model):
    tablename = "tags"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "name": orm.String(max_length=30, unique=True),
    }

# 多对多关系表(文章-标签)
class PostTag(orm.Model):
    tablename = "post_tags"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        "post": orm.ForeignKey(Post, on_delete=orm.CASCADE),
        "tag": orm.ForeignKey(Tag, on_delete=orm.CASCADE),
    }

初始化数据库

# 创建所有表
async def init_db():
    await models.create_all()
    
    # 创建初始分类
    await Category.objects.get_or_create(name="技术", slug="tech")
    await Category.objects.get_or_create(name="生活", slug="life")
    
    # 创建初始标签
    tags = ["Python", "异步编程", "ORM", "数据库"]
    for tag in tags:
        await Tag.objects.get_or_create(name=tag)

核心业务逻辑

async def create_post_with_tags(author_id, title, content, category_id, tag_names):
    """创建带标签的文章"""
    async with database.transaction():
        # 创建文章
        post = await Post.objects.create(
            title=title,
            slug=slugify(title),  # 需要导入slugify函数
            content=content,
            author_id=author_id,
            category_id=category_id,
            is_published=True
        )
        
        # 添加标签
        for tag_name in tag_names:
            tag, _ = await Tag.objects.get_or_create(name=tag_name)
            await PostTag.objects.create(post=post, tag=tag)
            
        return post

async def get_post_with_details(slug):
    """获取带所有关联数据的文章详情"""
    # 获取文章基本信息
    post = await Post.objects.select_related("author", "category").get(slug=slug)
    
    # 获取评论
    post.comments = await Comment.objects.select_related("author").filter(
        post=post
    ).order_by("-created_at").all()
    
    # 获取标签
    post_tags = await PostTag.objects.select_related("tag").filter(post=post).all()
    post.tags = [pt.tag for pt in post_tags]
    
    return post

async def get_posts_by_category(category_slug, page=1, per_page=10):
    """按分类分页获取文章"""
    category = await Category.objects.get(slug=category_slug)
    offset = (page - 1) * per_page
    
    posts = await Post.objects.select_related("author", "category").filter(
        category=category,
        is_published=True
    ).order_by("-created_at").limit(per_page).offset(offset).all()
    
    # 获取总数量用于分页
    total = await Post.objects.filter(
        category=category,
        is_published=True
    ).count()
    
    return {
        "posts": posts,
        "category": category,
        "total_pages": (total + per_page - 1) // per_page,
        "current_page": page
    }

API集成示例(FastAPI)

from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI()

# 依赖项:获取当前用户
async def get_current_user():
    # 实际应用中应实现认证逻辑
    return await User.objects.first()

# Pydantic模型
class PostCreate(BaseModel):
    title: str
    content: str
    category_id: int
    tag_names: List[str]

class PostResponse(BaseModel):
    id: int
    title: str
    slug: str
    content: str
    author: dict
    category: dict
    tags: List[dict]
    comments: List[dict]
    created_at: datetime.datetime

# API端点
@app.post("/posts", response_model=PostResponse)
async def create_post(
    post_data: PostCreate,
    current_user=Depends(get_current_user)
):
    post = await create_post_with_tags(
        author_id=current_user.id,
        **post_data.dict()
    )
    return await get_post_with_details(post.slug)

@app.get("/posts/{slug}", response_model=PostResponse)
async def get_post(slug: str):
    try:
        return await get_post_with_details(slug)
    except orm.NoMatch:
        raise HTTPException(status_code=404, detail="文章不存在")

性能优化:让异步ORM飞起来

数据库索引策略

合理设计索引是提升查询性能的关键:

class OptimizedModel(orm.Model):
    tablename = "optimized"
    registry = models
    fields = {
        "id": orm.Integer(primary_key=True),
        # 频繁过滤字段添加索引
        "status": orm.String(max_length=20, index=True),
        # 外键自动创建索引,但可显式指定
        "user_id": orm.ForeignKey("users", index=True),
        # 唯一索引确保数据唯一性并加速查询
        "external_id": orm.String(max_length=50, unique=True),
    }

对于复杂查询条件,创建复合索引:

# 通过SQLAlchemy表对象创建复合索引
from sqlalchemy import Index

table = OptimizedModel.__table__
Index("idx_status_user", table.c.status, table.c.user_id)

查询优化技巧

只获取需要的字段
# 只查询所需字段,减少数据传输
posts = await Post.objects.values("id", "title", "created_at").all()
批量操作代替循环单个操作
# 批量创建(优于循环create)
await Product.objects.bulk_create([
    {"name": "产品1", "price": 99.99},
    {"name": "产品2", "price": 199.99},
    # ...更多产品
])

# 批量更新(优于循环update)
await Product.objects.filter(category_id=5).update(on_sale=True)
避免N+1查询问题
# 不好的方式:导致N+1查询
posts = await Post.objects.all()
for post in posts:
    author = await User.objects.get(id=post.author_id)  # 每条记录一次查询

# 好的方式:预加载关联数据
posts = await Post.objects.select_related("author").all()
for post in posts:
    print(post.author.name)  # 无需额外查询

连接池配置

优化数据库连接池设置提升并发性能:

# 优化连接池配置
database = databases.Database(
    "postgresql://user:password@localhost/dbname",
    min_size=5,       # 最小连接数
    max_size=20,      # 最大连接数
    timeout=30.0,     # 连接超时
    command_timeout=5.0  # 命令超时
)

缓存策略

对频繁访问的只读数据实施缓存:

from cachetools import TTLCache

# 创建时间限制缓存(10分钟过期)
cache = TTLCache(maxsize=100, ttl=600)

async def get_categories():
    """获取分类列表(带缓存)"""
    if "categories" in cache:
        return cache["categories"]
        
    categories = await Category.objects.all()
    cache["categories"] = categories
    return categories

常见问题与解决方案

连接管理

问题:应用退出时显示数据库连接未关闭。

解决方案:使用生命周期钩子确保连接关闭:

# FastAPI示例
@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

事务回滚

问题:事务中发生异常但未正确回滚。

解决方案:确保使用async with上下文管理器:

try:
    async with database.transaction():
        # 执行数据库操作
        await Model.objects.create(...)
        # 如果发生异常,将自动回滚
except Exception as e:
    # 处理异常
    pass

数据迁移

问题:模型变更后如何更新数据库结构。

解决方案:使用Alembic进行迁移:

# 创建迁移脚本
alembic revision --autogenerate -m "Add new field to User model"

# 检查生成的脚本是否正确,然后应用
alembic upgrade head

异步兼容性

问题:与同步库一起使用时出现事件循环错误。

解决方案:确保所有数据库操作在异步上下文中执行:

# 错误示例(同步函数中调用异步方法)
def sync_function():
    note = await Note.objects.first()  # 会引发错误

# 正确示例
async def async_function():
    note = await Note.objects.first()  # 在异步函数中调用

性能问题排查

问题:查询执行缓慢。

解决方案:启用查询日志查看执行的SQL:

database = databases.Database(
    "sqlite:///mydb.sqlite",
    log_execute=True  # 启用执行日志
)

分析慢查询并添加适当索引或优化查询结构。

总结与展望

encode/orm作为一个现代化的异步ORM框架,为Python开发者提供了简洁而强大的数据访问层解决方案。通过本文的学习,你已经掌握了:

  • 模型设计与字段定义的最佳实践
  • 高效的异步CRUD操作技巧
  • 复杂模型关系的设计与查询
  • 性能优化与高级特性应用
  • 完整项目的实战开发流程

框架发展趋势

encode/orm正处于活跃开发中,未来版本可能会引入:

  • 更完善的多对多关系支持
  • 内置的全文搜索功能
  • 数据库迁移工具集成
  • 更丰富的查询表达式

进一步学习资源

  • 官方文档:https://www.encode.io/orm
  • 源码仓库:https://gitcode.com/gh_mirrors/orm/orm
  • 示例项目:框架仓库中的examples目录
  • 社区支持:GitHub Issues和Discord社区

最后的建议

  • 始终使用事务处理多步数据库操作
  • 为频繁查询的字段添加适当索引
  • 利用select_related避免N+1查询问题
  • 对复杂报表查询考虑使用原始SQL
  • 定期更新框架版本获取性能改进

掌握encode/orm将使你在构建异步Python应用时如虎添翼。无论是开发高性能API、实时数据处理系统还是异步后台任务,这个强大的ORM框架都能显著提高你的开发效率并优化应用性能。

如果你觉得本文对你有帮助,请点赞、收藏并关注作者,获取更多Python异步编程和数据库优化的深度教程!

下一篇我们将深入探讨encode/orm与FastAPI的集成技巧,以及如何构建支持百万级用户的异步数据服务架构。敬请期待!

【免费下载链接】orm An async ORM. 🗃 【免费下载链接】orm 项目地址: https://gitcode.com/gh_mirrors/orm/orm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值