Django model层之执行原始SQL查询
Django model层之执行原始SQL查询
by:授客 QQ:1033553122
测试环境
Win7
Django 1.11
执行原始SQL查询
Manager.raw
(raw_query, params=None, translations=None)
例子:
from website.models import API_case_tree
sql_for_cases_query = 'SELECT id, creater FROM website_api_case_tree'
query_set = API_case_tree.objects.raw(sql_for_cases_query)
for item in query_set:
print(item.id, item.creater)
说明:
执行raw查询,查询列必须包含主键id
某次实践时发现,通过raw执行以下语句,会报错:not enough arguments for format string
SELECT data_date, group_id as id, groupname AS name
FROM tb_zentao_group_defect_trend_daily_statistics WHERE DATE_FORMAT(data_date,"%Y-%m-%d") >="2019-05-01" AND DATE_FORMAT(data_date,"%Y-%m-%d") <="2019-08-03"
解决方案:格式化参数中的 % 写成 %%,如下:
SELECT data_date, group_id as id, groupname AS name
FROM tb_zentao_group_defect_trend_daily_statistics WHERE DATE_FORMAT(data_date,"%%Y-%%m-%%d") >="2019-05-01" AND DATE_FORMAT(data_date,"%%Y-%%m-%%d") <="2019-08-03"
序列化
假如想要序列化上述例子中返回的RawQuerySet,可才用以下方式
from django.core import serializers
result = json.loads(serializers.serialize('json', query_set), encoding='utf-8')
如果返回的RawQuerySet为空,则序列化结果result为 [],否则返回类似以下结果
[{'pk': 400, 'model': 'appName. website_api_case_tree, 'fields': {'id': 24, 'creater': '曾龙'}}, {'pk': 401, 'model': 'appName. website_api_case_tree, 'fields': {'id': 24, 'creater': 'x彬'}}]
说明:pk为主键,对应数据库的主键id,model为数据表对应的的应用的model,appName为创建的应用的名称,fields存放查询的字段结果
另外,也可以通过fields参数限制 fields字段值中返回的字段(需要注意的时,fields中指定的字段必须时数据库中存在的字段,不能是别名)
例子:限制fields中仅返回id和creater字段
serializers.serialize('json', query_set, fields=('id', 'creater'))
注意:实践时发现,执行的sql语句关联表时使用了左连接,发现采用上述方式对结果集进行序列化后,右表中的字段全部缺失,解决方法如下,通过遍历获取对应结果:
query_set = Project.objects.raw(sql)
rows = []
for
item in query_rows:
item.__dict__.pop('_state') # 移除不必要的字段
# 针对datetime、date类型字段,需要格式化处理,有必要也可以封装成函数
item.__dict__['create_time'] =
item.__dict__['create_time'].strftime('%Y-%m-%d %H:%M:%S')
item.__dict__['update_time'] =
item.__dict__['update_time'].strftime('%Y-%m-%d %H:%M:%S')
item.__dict__['begin_time'] = item.__dict__['begin_time'].strftime('%Y-%m-%d')
item.__dict__['end_time'] =
item.__dict__['end_time'].strftime('%Y-%m-%d')
rows.append(item.__dict__)
Django model层之执行原始SQL查询的更多相关文章
- Django文档阅读之执行原始SQL查询
Django提供了两种执行原始SQL查询的方法:可以使用Manager.raw()来执行原始查询并返回模型实例,或者可以完全避免模型层直接执行自定义SQL. 每次编写原始SQL时都要关注防止SQL注入 ...
- 在django中,执行原始sql语句
extra()方法 结果集修改器,一种提供额外查询参数的机制 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where ...
- django不定义model,直接执行自定义SQL
如果不想定义model,直接执行自定义SQL,可如下操作: 1. 通过 connections获取db连接,如果是多个数据库,connections['dbName'] 来选择 2. 获取游标 cur ...
- 12.Django数据库操作(执行原生SQL)
1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1& ...
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?
前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...
- django 执行原始SQL
二.知识点总结 When the model query APIs don’t go far enough, you can fall back to writing raw SQL. go far ...
- 在sql server中怎样获得正在执行的Sql查询
方法1:使用DBCC inputbuffer(spid) 使用SP_WHO获得SPID,然后再执行上面的DBCC command,参见下图 执行一段sql语句 打开另一个query窗口并执行SP_WH ...
- django框架 - 实时查看执行的sql语句
django框架采用的ORM模型,我们可以通过mysql的日志记录实时看到执行的sql语句,具体步骤如下: 第一步:找到mysql的配置文件 第二步:编辑mysql配置文件 第三步:重启mysql 第 ...
- 【Django】Django 直接执行原始SQL 如何防止SQL注入 ?
代码示例: #错误--不要直接格式化字符串 query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname Person.objec ...
随机推荐
- skipped: maximum number of running instances reached (1)
apscheduler定时任务报错skipped: maximum number of running instances reached (1) 原因是默认max_instances最大定时任务是1 ...
- Linux之kill命令
1.kill命令的使用格式 kill [参数] [进程号] 2.kill命令的功能 发送指定的信号到相应进程.不指定型号将发送SIGTERM(15)终止指定进程.如果任然无法终止该程序可用" ...
- gossh nohup部署退出解决方法
ssh 会话远程nohup ./node> node.out & 执行指令,会话退出以后也会导致服务并没有部署成功. 应该使用以下命令:nohup ./node > node.ou ...
- 文字转语音 - 搭建微软tts整合web服务提供api接口(免费)
微软tts是业界公认文字转语音效果最佳本文使用docker搭建微软tts服务并提供api接口对外提供服务对接官方免费在线体验接口,搭建后可免费进行调用使用,不保证永久稳定可用 调用方式url:http ...
- Leetcode数组-二分法
Leetcode数组-二分法 二分法学习地址 二分法 704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 targe ...
- iOS手工Crash解析
一.测试导出来一份ips crash文件,现在需要进行手工解析 现在需要下载对应的dsym文件,为了确定下载好的dsym文件和crash log是不是一致的,可以先看下dsym文件中的uuid p.p ...
- MySQL学习笔记-多表查询(上)
多表查询(上) 一. 多表关系 在实际应用中,根据需求,设计的表结构之间存在联系,联系一般分为以下三种 一对多(多对一) 多对多 一对一 1. 一对多(多对一) 案例:部门与员工的关系,一个部门对应多 ...
- itestwork(爱测试)开源一站式接口测试&敏捷测试工作站 9.0.0 RC2 发布,重大升级
(一)itest 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷.itest work 包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1 ...
- FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
FlashDuty:一站式告警响应平台,前往此地址免费体验! FlashDuty 现在已经全面支持了深色模式,这为您提供了更柔和的光线和舒适的界面外观.并且,您可以根据自己的喜好和使用环境动态切换深色 ...
- springmvc组件说明
DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度. HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应 ...