最近在做 python 开发的时候,发现一个非常好用的 ORM 框架《Tortoise ORM》。它是是一个受 Django 启发的易于使用的异步 ORM(对象关系映射器),它的设计中有着这样一句话:“你不仅要处理表,还要处理关系数据"。 ORM(对象关系映射器)旨在解决这些问题,通过集中您的数据模型和数据规则,确保您的数据得到安全管理(提供对 SQL 注入的免疫力)并跟踪关系,因此您不必。
介绍
- Tortoise ORM 是受 Django 启发的易于使用的 asyncioORM (对象关系映射器) 。
- Tortoise ORM 的构建类似于 Django ORM。它的设计中不仅使用表格,还使用关系数据。
- 与其他 Python ORM 相比,它也表现良好,与 Pony ORM 进行交易:
Tortoise ORM 支持那些数据库
Tortoise 当前支持以下数据库:
- SQLite (using aiosqlite)
- PostgreSQL >= 9.4 (using asyncpg or psycopg)
- MySQL/MariaDB (using asyncmy)
- Microsoft SQL Server (using asyncodbc)
环境配置
pip install tortoise-orm
# 安装数据库驱动
pip install tortoise-orm[asyncpg]
pip install tortoise-orm[aiomysql]
pip install tortoise-orm[asyncmy]
# 除此之外,还支持:aiosqlite
数据库链接
sqlite
通常采用以下形式sqlite://DB_FILE
因此,如果 DB_FILE 为/data/DB.sqlite3
,则字符串将为sqlite:///data/db.sqlite3
(注意三个/)
mysql
mysql://user:password@host:3306/somedb
- user:用于连接的用户名
- password: 用户名的密码。
- host:数据库所在的网络主机
- port:数据库可用的网络端口.(默认为 3306)
- database:要使用的数据库。
postgres
postgres 数据库通常采用以下形式:
asyncpg://postgres:pass@db.host:5432/somedb #异步
psycopg://postgres:pass@db.host:5432/somedb #同步
mssql
mssql 数据库通常采用以下形式:
mssql://user:pass@host:1433/db?driver=theodbcdriver
- user: 用于连接的用户名
- password: 用户名的密码。
- host: 数据库所在的网络主机
- port: 数据库可用的网络端口。(默认为 1443)
- database: 要使用的数据库。
- driver: 要使用的 ODBC 驱动程序。ODBC 驱动程序的实际名称 odbcinst.ini 文件(您可以使用最小值命令)。它要求 Unix 数据中心安装在您的系统中。
创建数据库
from tortoise import Tortoise, run_async
async def init():
# Here we create a SQLite DB using file "db.sqlite3"
# also specify the app name of "models"
# which contain models from "app.models"
await Tortoise.init(
db_url='sqlite://db.sqlite3',
modules={'models': ['models']}
)
# Generate the schema
await Tortoise.generate_schemas() # safe:仅在表不存在时创建表
run_async(init()) # 会自动进入上下文处理,在运行完成时,自动关闭数据库连接
如果要使用 MySQL 就要安装依赖
pip install tortoise-orm[aiomysql]
创建模型
from tortoise.models import Model
from tortoise.manager import Manager
class Team(Model):
id = fields.IntField(pk=True)
name = fields.TextField()
class Meta:
abstract = False
table = "team"
table_description = ""
unique_together = ()
indexes = ()
ordering = []
manager = Manager
- abstract:设置为 True 表明这是一个抽象类,不会生成数据表
- table:设置表名,不设置默认已类名作为数据表名
- table_description:设置此项可为为当前模型创建的表生成注释消息
unique_together : 指定 unique_together 为列集设置复合唯一索引,其为元组的元组- indexes:指定 indexes 为列集设置复合非唯一索引,它应该是元组的元组
- ordering : 指定 ordering 为给定模型设置默认排序。.order_by(...)它应该可以迭代以与接收相同的方式格式化的字符串。
- manager: 指定 manager 覆盖默认管理器。它应该是实例 tortoise.manager.Manager 或子类。
字段
更详细的信息可以查看[官方文档]
数据字段
Field(source_field = None , generated = False , pk = False , null = False , default = None , unique = False , index = False , description = None , model = None , validators = None , ** kwargs
source_field (Optional[str])
: 如果 DB 列名称需要是特定的而不是从字段名称中生成,则提供 source_field 名称。generated (bool)
: 该字段是否由数据库生成pk (bool)
: 该字段是否为主键null (bool)
: 主键是否可以为空default (Optional[Any]
):该字段的默认值unique (bool)
:该字段的值是否唯一index (bool)
:设置该字段是否为索引description (Optional[str])
:字段描述,也将出现在Tortoise.desc> ribe_model()
生成的 DDL 中并作为 DB 注释出现。validators (Optional[List[Union[Validator, Callable]]])
:此字段的验证器
关系字段
ForeignKeyField( model_name , related_name = None , on_delete = 'CASCADE' , db_constraint = True , ** kwargs )
OneToOneField( model_name , related_name = None , on_delete = 'CASCADE' , db_constraint = True , ** kwargs )
model_name
:关联模型的名称{app}.{models}
related_name
:相关模型上的属性名称,用于反向解析外键on_delete
:field.CASCADE
:表示如果相关模型被删除,该模型应该被级联删除field.RESTRICT
:表示只要有外键指向,相关模型删除就会受到限制field.SET_NULL
:将字段重置为 NULL,以防相关模型被删除。仅当字段已设置时才能null=True
设置field.SET_DEFAULT
:将字段重置为default值,以防相关模型被删除。只能设置是字段有一个default集合to_field
:建立外键关系的相关模型上的属性名。如果未设置,则使用pkdb_constraint
: 控制是否应在数据库中为此外键创建约束。默认值为 True,将此设置为 False 可能对数据完整性非常不利
ManyToManyField(model_name, through=None, forward_key=None, backward_key='', related_name='', on_delete='CASCADE', db_constraint=True, **kwargs)
through
:通过中间表进行连接forward_key
: 直通表上的正向查找键。默认值通常是安全的backward_key
: 通表上的向后查找键。默认值通常是安全的
查询
模型本身有几种方法可以启动查询:
filter(*args, **kwargs)
:使用给定的过滤器创建 QuerySetexclude(*args, **kwargs)
:使用给定的排除过滤器创建 QuerySetall()
:创建不带过滤器的查询集first()
:创建仅限于一个对象的查询集并返回实例而不是列表annotate()
: 使用额外的函数/聚合对结果进行再过滤
其中filter
可以指定的对象:
in
:检查字段的值是否在传递列表中not_in
: 检查字段的值是不在传递列表中gte
:大于或等于传递的值gt
:大于传递值lte
:低于或等于传递的值lt
:低于通过值range
:介于和给定两个值之间isnull
:字段为空not_isnull
:字段不为空contains
:字段包含指定的子字符串icontains
:不区分大小写containsstartswith
:如果字段以值开头istartswith
:不区分大小写startswithendswith
:如果字段以值结尾iendswith
:不区分大小写endswithiexact
:不区分大小写等于search
:全文搜索
Q 对象
Q( * args , join_type = 'AND' , ** kwargs )
join_type
:连接类型,OR\ANDargs ( Q)
:Q要包装的内部表达式kwargs ( Any)
:此 Q 对象应封装的过滤语句