tortoise-orm看着一篇足够你入门
最近在看关于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
注意,因为Tortoise
的mysql
模块依赖于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
,这里和Django
的from 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
基本能满足各种日常的事务处理,而且由于他还是一个比较新的框架,所以很多东西会变,如果有问题,请及时关注官网信息。