背景
在写项目的时候,有时候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() #