正在进入ing...

tortoise-orm看着一篇足够你入门

发布时间:2022-11-20 浏览量: 2077 文章分类: python

最近在看关于FastAPI相关文档的时候,发现里面一个优秀的操作数据库的框架tortoise-orm,我之前还在用sqlaichemy的异步ORM来实现业务,具体也可以点击Sqlalchemy 异步操作体验,和这个对比一下,感觉学习成本几乎没有。这个还更方便一些。作者自己也说他的灵感来源于Django(inspired by Django.),所以使用起来感觉更加顺手。这里做一个备忘。顺带一波安利,真的是好用。

安装

这货的官网地址是在这里 Tortoise ORM官网 安装比较简单 pip install tortoise-orm

初体验(Sqlite3)

根据官网教程,我稍微做了一些调整,将数据表改成了自己设置的. 下面是我的目录

├── main.py
├── models
│ └── user_models.py
# user_models.py
from tortoise.models import Model
from tortoise import fields

class UserModel(Model):
    id = fields.IntField(pk=True,description="主键")
    user_name = fields.CharField(max_length=150)
    password = fields.CharField(max_length=150)
    created_time = fields.DatetimeField(auto_now_add=True)
    update_time = fields.DatetimeField(auto_now=True)
# main.py

from tortoise import Tortoise,run_async

async def init():
    # 初始化
    await Tortoise.init(
        db_url='sqlite://db.sqlite3',
        modules={'models':['models.user_models']}
    )
    # 异步生成模式
    await Tortoise.generate_schemas()


run_async(init())

上面的代码执行后,他会首先帮我们生成了一个db.sqlite3的数据库文件,然后在里面帮我们创建了一张名字叫usermodel的表,表内容并包含了我们设置好的字段。 对于user_models.py的内容,我应该不用过多介绍,熟悉Django ORM的人肯定看着格外眼熟。 这里说中备忘一下main.py里面的内容,其实主要的也就是看init()里面的内容,只要使用Tortoise.init进行初始化,就可以轻松实现对数据库的链接,而modules的指定则是为了确认数据的存放位置(当然你也可以单文件)

切换数据库类型

根据Tortoise官网的介绍,目前支持的数据有3种。

PostgreSQL >= 9.4 (using asyncpg)
SQLite (using aiosqlite)
MySQL/MariaDB (using aiomysql or use asyncmy)

其实切换数据库这里,甚至都没什么好说的。只要这样更改一行数据就可以切换到mysql。 输入格式为mysql://myuser:mypass:pass@db.host:3306/somedb

注意,因为Tortoisemysql模块依赖于aiomysql,所以你还需要执行pip install aiomysql安装才可以,否则会报错No module named 'aiomysql

await Tortoise.init(
        db_url='mysql://root:123456@127.0.0.1:3306/test',
        modules={'models':['models.user_models']}
    )

当然有的设置会增加连接池显示SQL方便调试等。还提供了下面的参数方便我们来进行动态更改。

MySQL 动态参数调整配置

minsize (默认 1):
最小连接池大小

maxsize (默认是 5):
最大连接池大小

connect_timeout (默认是0):
报出错误前等待时间

echo (默认关闭,则 False):
设置为True则以回显SQL查询(仅在调试时)

no_delay (默认为无):
设置套接字

charset (设置字符集,默认是utf8mb4):
设置使用中的字符集

ssl (默认是 False):
设置SSL安装证书相关

数据库模型问题

在使用之前,需要先行导入from tortoise.models import Model,这里和Djangofrom django.db import models基本是一个道理。 同时他也支持我们对模型的描述。回到开始的例子,我们可以继续对他进行完善。

# user_models.py
class UserModel(Model):
    id = fields.IntField(pk=True)
    user_name = fields.CharField(max_length=150)
    password = fields.CharField(max_length=150)
    created_time = fields.DatetimeField(auto_now_add=True)
    update_time = fields.DatetimeField(auto_now=True)

    def __str__(self):
        return self.id

    class Meta:
        table = "user_permissions_table"
        indexes = (('id','user_name'))
        unique_together = (('id','user_name'))

注意看,增加了__str__来返回主键、增加了Meta类,通过table来指定表名、通过unique_together来设置复合索引。

Meta支持参数如下。

abstract=False

设为True,表示这是一个抽象类。

table=""

手动指定数据库创建时的表名

table_description=""

生成表注释信息

unique_together = None

指定unique_together来为列的集合设置复合唯一索引。 它应该是一个元组的元组(列表也可以),格式如上面例子那样。

indexes = None

指定索引,为列的集合设置复合非唯一索引。 它应该是一个元组的元组(列表也可以),格式如上面例子那样。

ordering = None

指定排序,同Django

manager = tortoise.manager.Manager

指定Tortoise管理器来覆盖默认的管理器。

数据表关系

ForeignKeyField

这玩意基本就是照着抄写Django的,所以貌似没啥说的。一样的用法,直接放个官网的例子了。

tournament = fields.ForeignKeyField('models.Tournament', related_name='events')
participants = fields.ManyToManyField('models.Team', related_name='events')
modified = fields.DatetimeField(auto_now=True)
prize = fields.DecimalField(max_digits=10, decimal_places=2, null=True)

ManyToManyField

同上,还是基本照着Django抄的,没啥好说的。

综上来看,如果不是特别的要求,其实Tortoise基本能满足各种日常的事务处理,而且由于他还是一个比较新的框架,所以很多东西会变,如果有问题,请及时关注官网信息。