美文网首页
32、ORM_执行原生sql

32、ORM_执行原生sql

作者: 猪儿打滚 | 来源:发表于2020-08-24 19:57 被阅读0次

背景

在写项目的时候,有时候orm所提供的查询API无法满足我们的需求,此时我们就需要执行原生sql语句

1、基于模型实例执行原生sql

这种方式依旧是基于模型实例,其结果也是返回对应的模型实例。如果需求是要对查询结果进行基于ORM的CRUD操作,那么建议使用这种方式,因为可以直接操作模型实例。
注意点:使用这种方式查询,查询结果必须包含主键,否则报错Raw query must include the primary key
语句:xxx.objects.raw(' sql语句 ')
例子:

# 直接orm的filter
case_objs = Cases.objects.filter(interfaces__contains=interface_id, is_delete=False)
# 转成sql执行 返回一个cases模型的查询集对象
case_objs = Cases.objects.raw(
    " SELECT `pf_cases`.`create_time`, `pf_cases`.`update_time`, "
    "`pf_cases`.`is_delete`, `pf_cases`.`id`, `pf_cases`.`project_id`, "
    "`pf_cases`.`model_id`, `pf_cases`.`name`, `pf_cases`.`desc`, "
    "`pf_cases`.`case_type`, `pf_cases`.`interfaces` "
    "FROM `pf_cases` "
    "WHERE (`pf_cases`.`interfaces` "
    F"LIKE BINARY '%{interface_id}%' "
    "AND NOT `pf_cases`.`is_delete`);")

2、避开模型层执行原生sql

这种方式,就相当于直接连接数据库进行sql操作,类似pymysql的操作
当我们查询的语句不想返回主键,或者无法返回主键时,则可以使用这种方式
例子:

from django.db import connection

cursor=connection.cursor()
# 执行查询,返回的是一个查询结果元组
cursor.execute('select * from interfaces')
# 多个字段或多条数据;如果是单个字段一条数据,比如说返回的count(xx),咋返回的是一个int值,不需要进行fetchall
ret=cursor.fetchall() #

相关文章

网友评论

      本文标题:32、ORM_执行原生sql

      本文链接:https://www.haomeiwen.com/subject/nvqojktx.html