通过上篇文档了解到Tortoise ORM
的基本知识点,下面通过一些实际的操作来体验一下吧。
创建用户模型
在创建模型类时,把一些公共的字段抽离出来,用继承方式重复利用。如果模型类型的字段与数据库字不一样时候,可以通过source_field
指定。Meta
定义表的元数据信息,例如:表名,表描述信息等等。
#models.py
class MixinTimeFiled:
# 添加数据时间
created = fields.DatetimeField(null=True, auto_now_add=True)
# 修改数据时间
modified = fields.DatetimeField(null=True, auto_now=True)
class userModel(MixinTimeFiled,Model):
id = fields.BigIntField(pk=True,description="用户ID",index=True,source_field="user_id")
name = fields.CharField(max_length=100,description="用户名",source_field="name")
phone = fields.CharField(max_length=11,description="电话号")
idcard =fields.CharField(max_length=18,description="身份号")
birthDate = fields.CharField(max_length=18,description="出生年月")
email = fields.CharField(max_length=50,description="邮箱地址")
address = fields.CharField(max_length=200,description="地址信息")
class Meta:
table = "users"
❝关于各字段的用法查看官方
❞
配置数据库相关信息
async def init():
await Tortoise.init(
db_url='mysql://didiplus:didiplus@192.168.0.220:3306/tortoise',
modules={'models': ['models']}
)
# Generate the schema
await Tortoise.generate_schemas() # safe:仅在表不存在时创建表
增(Create)
Tortoise ORM
模型提供了create
方法,通过查看源码create
方法实际上也是调用了save
方法。所以,有两种方式添加数据。
❝本案例使用Faker
这个库去模拟用户数据,具体的用法请参考这篇文章
❞
save 方法新增数据:
通过实例化用户模型类的方式,调用save
方式创建数据,核心代码如下:
fake = Faker(["zh_CN"])
id_card = fake.ssn()
async def add():
user = userModel(
name=fake.name(),
phone = fake.phone_number(),
idcard = fake.ssn(),
birthDate = id_card[6:14],
email = fake.email(),
address = fake.address()
)
return await user.save()
由于Tortoise ORM
采用了异步编程方式,所以,需要通过run_async
函数去调用add
方式.核心代码如下:
if __name__ == "__main__":
run_async(init()) #连接数据库
run_async(add())
create方法新增数据
直接通过用户模型类赋值方式,然后调用create
方法。核心代码如下:
async def add2():
return await userModel().create(
name=fake.name(),
phone = fake.phone_number(),
idcard = fake.ssn(),
birthDate = id_card[6:14],
email = fake.email(),
address = fake.address()
)
执行之后,数据库会生成两条数据,如下图:
批量添加数据
Tortoise ORM
模型类中也封装了批量新增数据的函数bulk_create
。源码如下:
通过观察源码的注解,该方法调用方式,只要传入一个list列表,列表里的元素是user模型对象即可。
async def bulk_add():
usersList =[]
for _ in range(0,10):
id_card = fake.ssn()
user = userModel(
name=fake.name(),
phone = fake.phone_number(),
idcard = fake.ssn(),
birthDate = id_card[6:14],
email = fake.email(),
address = fake.address()
)
usersList.append(user)
return await userModel.bulk_create(usersList)
❝先通过一个for循环生成11个userModel
对象,然后中通过调userModel
的bulk_create
方法,把这个11个用户信息写入数据库中。
❞
删除(Delete)
Tortoise ORM
模型类中封装了Delete
方法,通过过来查询出要删除的对象,然后再调用delete
方法。核心代码如下:
#删除ID为1的数据,返回的是被改的行数
async def deleteById(id):
return await userModel.filter(id=id).delete()
❝Tortoise ORM
模型中没有封装批量删除的方式,后续可以根据自己的业务情况自行封装。
❞
修改(update)
Tortoise ORM
模型中封装了几个有关更新的方法,分别是update_from_dict
、update_or_create
、update
。其中update
是通过filter
查询对象,再更新相应的字段。
async def update():
return await userModel.filter(id=2).update(address=fake.address())
查看(select)
all
#查询所有,返回是用户模型对象[<userModel: 2>,...]
await userModel.all()
#过滤需要的字段,返回dict对象
await userModel.all().values("id","name")
await userModel.all().order_by("-created") #排序,-是降序
#分页查询
await userModel.all().offset(2).limit(5)
get
根据条件查询符合的对象,条件需唯一 return UserModel
await userModel.get(id=13)
#查询不到返回None,避免 出现对象不存在的异常
await userModel.get_or_none(id=15)
filter 条件过滤
其实filter的用法和get的差不多,都是通过条件过滤。
# 获取第一个符合条件的 return UserModel
await userModel.filter(name="林超").first()
# 获取原生sql
userModel.filter(name="林超").sql()
原生SQL
在项目中有时候可能需要执行原生的SQL
语言。可以使用下面的方式执行:
async def executSQL(sql):
conn = connections.get("default")
res= await conn.execute_query_dict(sql)
return res
filter Q
在使用之前先执行如下代码引入依赖
from tortoise.models import Q
await userModel.filter(Q(name="蒋洁",id=13,join_type="OR")).all()
❝关于Q的更多用法请查阅官方文档
❞