ORM
对象关系映射(Object Relational Mapping,简称ORM)是一种程序设计技术,用于在面向对象编程语言和关系数据库之间进行数据转换。ORM的核心思想是通过创建一个“虚拟对象数据库”,使开发者可以使用面向对象的方式操作数据库,而不需要直接编写复杂的SQL语句。
基本原理:ORM的基本原理是将数据库中的表映射为编程语言中的类,将表中的记录映射为类的实例,将表中的字段映射为类的属性。通过这种方式,开发者可以使用面向对象的方式进行数据库操作,例如插入、更新、删除和查询数据。
优势
简化开发:ORM使开发者可以使用面向对象的方式操作数据库,减少了编写SQL语句的复杂性。提高效率:ORM自动生成SQL语句,减少了手动编写SQL的错误和重复劳动增强可维护性:ORM使代码更加清晰和易于维护,因为数据操作逻辑被封装在类和方法中
常见ORM对比(Peewee ORM与Django ORM,SQLAlchemy ORM,Tortoise ORM)
Peewee ORM
Peewee 是一个轻量级、富有表现力且易于学习的 Python 对象关系映射库。它的核心目标是让与关系数据库的交互变得简单、直观,同时保持足够的灵活性来处理大多数常见任务。Peewee 非常适合初学者和小型项目。它以轻量、简洁、易用著称,能够快速实现数据库操作,减少开发成本。但在大型项目或需要复杂查询、异步支持的场景下,SQLAlchemy 或 Tortoise ORM 可能更合适。
核心特点:
轻量级: 代码库小巧(单个文件),依赖极少,启动和运行非常快。富有表现力的 API: 提供清晰、链式、类似 Python 风格的查询语法。易于学习: 设计直观,学习曲线平缓,文档优秀。支持多种数据库: SQLite, MySQL, PostgreSQL, CockroachDB (通过 playhouse 扩展)。声明式模型定义: 使用 Python 类定义模型(表)和字段(列)。丰富的查询功能: 支持复杂的查询操作(连接、子查询、窗口函数、通用表表达式 CTE 等)。事务和连接管理: 提供简洁的上下文管理器处理事务和数据库连接。扩展性: 通过 playhouse 模块提供各种扩展(信号、连接池、模式迁移工具、全文搜索、CSV 工具等)。
一、Peewee 基本数据库操作
安装 Peewee
pip install peewee
定义模型并连接数据库
from peewee import *
db = SqliteDatabase('my_app.db')
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
username = CharField(unique=True)
email = CharField()
is_active = BooleanField(default=True)
创建表
db.connect()
db.create_tables([User])
增(Create)
user = User.create(username='alice', email='alice@example.com')
查(Read)
# 查询所有
users = User.select()
# 条件查询
active_users = User.select().where(User.is_active == True)
# 分页查询
page_users = User.select().paginate(1, 10) # 第1页,每页10条
改(Update)
User.update(is_active=False).where(User.username == 'alice').execute()
删(Delete)
User.delete().where(User.username == 'alice').execute()
二、Peewee 的优缺点
优点说明轻量级代码简洁,依赖少,适合小型项目或快速开发。易学易用API 设计直观,类似 Django ORM,学习曲线平缓。支持多种数据库包括 SQLite、MySQL、PostgreSQL 等。功能丰富支持事务、连接池、分页、聚合、关联查询等高级功能。扩展性强提供 Playhouse 扩展库,支持迁移、反射、高级查询等。
缺点说明功能有限相比 SQLAlchemy,复杂查询和性能优化能力较弱。社区规模较小文档和社区支持不如 SQLAlchemy 和 Django ORM 丰富。异步支持不足原生不支持异步操作,不适合异步 Web 框架。迁移支持不完善官方未内置迁移工具,需依赖第三方库如 peewee-migrate。三、适用场景
小型项目:如脚本工具、原型开发、轻量级 Web 应用。快速开发:适合对开发效率要求高、数据库操作不复杂的项目。嵌入式或单文件应用:如使用 SQLite 的桌面应用或数据分析脚本。
Django ORM
Django ORM 是 Django 框架的核心组件之一,它提供了一种面向对象的方式来操作数据库。通过定义模型类(Model),Django ORM 会自动生成对应的数据库表结构,并提供丰富的 API 来进行数据库操作。Django ORM 是一个功能强大且易用的数据库操作工具,适合快速开发和中小型项目。它简化了数据库操作,提高了开发效率,但在性能和灵活性方面存在一定局限。对于复杂场景,可以结合原生 SQL 或数据库优化技巧来弥补 ORM 的不足。
一、基本使用步骤
定义模型(Model)
在 Django 应用的 models.py 文件中定义模型类,每个类对应数据库中的一张表。
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
price = models.DecimalField(max_digits=10, decimal_places=2)
publish_date = models.DateField()
def __str__(self):
return self.title
迁移数据库
定义模型后,需要执行迁移命令,Django 会自动生成对应的数据库表结构。
python manage.py makemigrations
python manage.py migrate
数据库操作
Django ORM 提供了丰富的 API 来进行数据库操作,包括增删改查(CRUD)等。
增加数据(Create)
# 创建单个对象
book = Book(title='Django入门', author='张三', price=39.99, publish_date='2023-01-01')
book.save()
# 或者使用 create() 方法
book = Book.objects.create(title='Python进阶', author='李四', price=49.99, publish_date='2023-02-01')
查询数据(Read)
# 查询所有记录
books = Book.objects.all()
# 条件查询
books = Book.objects.filter(author='张三')
# 获取单个对象
book = Book.objects.get(id=1)
# 排序
books = Book.objects.order_by('-publish_date')
更新数据(Update)
# 更新单个对象
book = Book.objects.get(id=1)
book.price = 29.99
book.save()
# 批量更新
Book.objects.filter(author='张三').update(price=29.99)
删除数据(Delete)
# 删除单个对象
book = Book.objects.get(id=1)
book.delete()
# 批量删除
Book.objects.filter(author='张三').delete()
二、Django ORM 的优缺点
优点说明简化开发使用 Python 代码操作数据库,无需编写复杂的 SQL 语句,降低开发难度。数据库无关性支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),切换数据库时无需修改代码。自动迁移通过迁移机制,自动同步模型与数据库结构,简化数据库版本管理。安全性高自动防止 SQL 注入攻击,提高应用安全性。功能丰富提供丰富的查询 API、关联关系管理、聚合函数、事务支持等高级功能。
缺点说明性能问题对于复杂查询或大数据量操作,ORM 生成的 SQL 可能不够高效,性能不如手写 SQL。学习成本初学者需要学习 ORM 的 API 和查询语法,掌握起来需要一定时间。灵活性不足对于特别复杂的 SQL 查询,ORM 可能难以实现,需要手写 SQL 或使用原生 SQL 查询。抽象层次高ORM 隐藏了底层数据库细节,开发者可能难以优化数据库性能。三、适用场景
使用 Django 框架 开发 Web 项目中小型项目,功能以 增删改查为主需要快速搭建后台(配合 Django Admin)构建企业官网、CMS、OA 系统、内部管理工具
SQLAlchemy ORM
SQLAlchemy 是 Python 中最流行、功能最强大的 ORM(对象关系映射)框架之一。它提供了丰富的工具和功能,允许开发者使用 Python 类和对象来操作数据库,而无需直接编写 SQL 语句。SQLAlchemy 分为两个主要部分:
SQLAlchemy ORM:提供面向对象的数据库操作方式。SQLAlchemy Core:提供更底层的 SQL 表达式语言,适合需要更精细控制 SQL 的场景。
SQLAlchemy ORM 允许你将数据库表映射为 Python 类,将表中的记录映射为类的实例。通过这种方式,你可以使用面向对象的方式进行数据库的增删改查操作。
SQLAlchemy ORM 是一个功能全面、灵活性高的 ORM 框架,适合需要精细控制数据库操作的项目。虽然学习成本较高,但其强大的功能和广泛的社区支持使其成为 Python 开发者的首选 ORM 工具之一。
一、基本使用步骤
安装 SQLAlchemy
pip install sqlalchemy
定义模型类(Model)
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(100))
连接数据库并创建会话
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
基本数据库操作
增加数据(Create)
new_user = User(name='Alice', email='alice@example.com')
session.add(new_user)
session.commit()
查询数据(Read)
# 查询所有用户
users = session.query(User).all()
# 条件查询
user = session.query(User).filter(User.name == 'Alice').first()
更新数据(Update)
user = session.query(User).filter(User.name == 'Alice').first()
user.email = 'newalice@example.com'
session.commit()
删除数据(Delete)
user = session.query(User).filter(User.name == 'Alice').first()
session.delete(user)
session.commit()
二、SQLAlchemy ORM 的优缺点
优点说明数据库无关性支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),切换数据库时无需修改大量代码。面向对象使用 Python 类和对象操作数据库,代码更清晰、易于维护。灵活查询提供强大的查询 API,支持链式调用、复杂查询、子查询、聚合等。事务支持内置事务管理,确保数据一致性和完整性。连接池管理自动管理数据库连接,提高性能和资源利用率。易于测试支持内存数据库,便于单元测试。
缺点说明学习曲线陡峭功能强大但概念较多,初学者需要一定时间掌握。性能开销由于抽象层次高,性能略低于原生 SQL,尤其在大量数据处理时。配置复杂初始配置相对繁琐,不适合极简项目。三、适用场景
中大型项目:需要复杂查询、事务处理、数据库抽象的项目。多数据库支持:需要在不同数据库之间迁移或兼容的项目。与 FastAPI、Flask 等框架集成:SQLAlchemy 是这些框架的推荐 ORM 工具。
Tortoise ORM
Tortoise ORM 是一个为 Python 异步编程设计的 ORM 框架,灵感来源于 Django ORM,但完全基于 asyncio 构建,适合构建高性能的异步 Web 应用,尤其是与 FastAPI、Sanic 等异步框架搭配使用。
Tortoise ORM 是一个面向未来的异步 ORM 框架,凭借其高性能、简洁的 API 设计和强类型支持,成为构建现代异步应用的理想选择。尽管生态和数据库支持仍有提升空间,但在异步 Web 开发领域,它已成为 FastAPI 等框架的黄金搭档。如果你正在构建异步 Web 应用,尤其是使用 FastAPI,Tortoise ORM 是一个值得优先考虑的工具。
一、Tortoise ORM 简介
Tortoise ORM 的主要特点包括:
原生异步支持:所有数据库操作均使用 async/await 语法,适配异步编程模型。类 Django 风格 API:语法简洁,易于上手,特别适合熟悉 Django 的开发者。强类型支持:结合 Python 类型注解,支持静态类型检查,减少运行时错误。内置迁移工具(Aerich):支持数据库版本管理和自动迁移。支持多种数据库:如 PostgreSQL、MySQL、SQLite,适配异步驱动如 asyncpg 和 aiomysql。
二、Tortoise ORM 基本数据库操作
模型定义
from tortoise.models import Model
from tortoise import fields
class User(Model):
id = fields.IntField(pk=True)
username = fields.CharField(max_length=50, unique=True)
email = fields.CharField(max_length=100)
is_active = fields.BooleanField(default=True)
初始化数据库连接
from tortoise import Tortoise
async def init():
await Tortoise.init(
db_url='sqlite://db.sqlite3',
modules={'models': ['__main__']}
)
await Tortoise.generate_schemas()
增(Create)
user = await User.create(username='alice', email='alice@example.com')
查(Retrieve)
# 查询所有
users = await User.all()
# 条件查询
user = await User.get(username='alice')
# 模糊查询
users = await User.filter(username__contains='a')
改(Update)
await User.filter(id=1).update(email='newemail@example.com')
删(Delete)
await User.filter(id=1).delete()
三、Tortoise ORM 的优缺点
优点说明异步原生完全基于 asyncio,支持高并发,适合现代异步 Web 框架。易用性强API 类似 Django ORM,学习成本低,开发效率高。类型安全支持类型注解和静态检查,减少数据错误。迁移工具完善内置 Aerich 工具,支持数据库迁移和版本控制。关系映射丰富支持一对一、一对多、多对多关系,支持预加载优化查询。
缺点说明生态尚不成熟相比 SQLAlchemy 等老牌 ORM,社区较小,文档和资源相对有限。数据库支持有限虽然支持主流数据库,但对某些数据库特性支持不如 SQLAlchemy 完善。学习成本对于不熟悉异步编程的开发者,上手仍需一定时间。四、适用场景
高并发异步应用:如使用 FastAPI、Sanic 构建的 API 服务。实时数据处理系统:如日志处理、物联网设备管理等。需要类型安全和自动迁移的项目:适合追求代码质量和结构清晰的中大型项目。