Python中的ORM框架Tortoise ORM详解

1. 什么是ORM框架

ORM(Object-Relational Mapping)是一种软件开发技术,用于将对象模型和关系型数据库之间进行映射。ORM框架可以通过代码操作数据库,将数据库操作转化为对象操作,从而简化了数据库操作的过程。

2. Tortoise ORM简介

Tortoise ORM是一个Python中的异步ORM框架,它基于Python的异步框架aiohttp和peewee ORM,同时支持SQLite、MySQL和PostgreSQL等多种数据库后端。

2.1 安装Tortoise ORM

要使用Tortoise ORM,首先需要使用pip安装Tortoise ORM的包:

pip install tortoise-orm

3. Tortoise ORM的基本用法

下面以一个示例来说明Tortoise ORM的基本用法:

3.1 创建模型

在Tortoise ORM中,我们需要创建模型类来映射数据库中的表。模型类需要继承自Tortoise ORM的Model类,并定义每个字段的类型和属性。

from tortoise import fields

from tortoise.models import Model

class User(Model):

id = fields.IntField(pk=True)

name = fields.CharField(max_length=255)

email = fields.CharField(max_length=255, unique=True)

3.2 连接数据库

在使用Tortoise ORM之前,我们需要先建立与数据库的连接。

from tortoise import Tortoise

async def init_db():

await Tortoise.init(db_url='mysql://user:password@localhost/mydatabase')

async def close_db():

await Tortoise.close_connections()

3.3 创建表

通过Tortoise ORM提供的sync_models()方法可以自动创建表:

async def create_tables():

await Tortoise.generate_schemas()

async def drop_tables():

await Tortoise.drop_databases()

3.4 插入数据

可以使用模型类的create()方法来插入数据:

async def insert_user(name, email):

user = await User.create(name=name, email=email)

return user

user = await insert_user('John Doe', 'john@example.com')

3.5 查询数据

可以使用模型类的filter()方法来进行查询:

async def get_user(email):

user = await User.filter(email=email).first()

return user

user = await get_user('john@example.com')

3.6 更新数据

可以使用模型实例的save()方法来更新数据:

async def update_user_name(user_id, new_name):

user = await User.filter(id=user_id).first()

user.name = new_name

await user.save()

await update_user_name(user.id, 'John Smith')

3.7 删除数据

可以使用模型实例的delete()方法来删除数据:

async def delete_user(user_id):

user = await User.filter(id=user_id).first()

await user.delete()

await delete_user(user.id)

4. Tortoise ORM的高级用法

Tortoise ORM还支持更多高级功能,如事务、关联查询、聚合查询等。

4.1 事务

可以使用Tortoise ORM提供的transaction()装饰器来实现事务:

from tortoise import transaction

@transaction

async def transfer_money(from_user_id, to_user_id, amount):

try:

from_user = await User.filter(id=from_user_id).first()

to_user = await User.filter(id=to_user_id).first()

from_user.balance -= amount

to_user.balance += amount

await from_user.save()

await to_user.save()

except Exception as e:

raise e

await transfer_money(from_user.id, to_user.id, 100)

4.2 关联查询

可以使用Tortoise ORM提供的prefetch_related()方法来进行关联查询:

async def get_user_with_posts(user_id):

user = await User.filter(id=user_id).prefetch_related('posts')

return user

user = await get_user_with_posts(user.id)

4.3 聚合查询

可以使用Tortoise ORM提供的annotate()方法来进行聚合查询:

from tortoise import Sum, Avg

async def get_total_balance():

total_balance = await User.annotate(total_balance=Sum('balance')).filter(total_balance__gt=1000)

return total_balance

total_balance = await get_total_balance()

5. 结语

Tortoise ORM是一个强大且易用的Python异步ORM框架,它简化了与关系型数据库的交互过程。通过Tortoise ORM,我们可以使用面向对象的方式操作数据库,更好地利用Python的异步特性,提高代码的效率和可维护性。希望本文能对您了解Tortoise ORM提供一些帮助。

后端开发标签