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 ...
随机推荐
- 记一次U8的插件开发
在u8上开发一个winform的插件用来实现不同账套之间的单据协同,使用的方法是用存储过程走数据库.因为原账套的数据量会很大,如果直接在插件上用单线程传输,那肯定会造成传输过程,u8卡死的.一种方法是 ...
- iOS 系统级别录屏方式调研
p.p1 { margin: 0; font: 20px ".PingFang SC"; color: rgba(69, 69, 69, 1) } p.p2 { margin: 0 ...
- java检测当前CPU负载状态的方法
1.java检测当前CPU负载状态 在Java中,直接检测CPU负载状态并不像在操作系统命令行中那样简单,因为Java标准库并没有直接提供这样的功能.但是,我们可以通过几种方法间接地获取CPU负载信息 ...
- ansible常用模块的学习
ansible常用模块列表: 1.file 点击查看代码 2.copy 点击查看代码 3.yum--repository 点击查看代码 4.yum 点击查看代码 5.service 点击查看代码 6. ...
- Linux下更新Python版本
参考:安装图形化配置解析工具_LiteOS_编译和开发工具_Linux下的编译_搭建Linux编译环境_华为云 (huaweicloud.com) 系统:Centos7 $ uname -a Linu ...
- SQL SERVER 同一台服务器,A库正常连接,B库提示“等待的操作过时”
SQL SERVER 同一台服务器,A库正常连接,B库提示"等待的操作过时" 解决方法: 在客户端(非SQL SERVER 服务器)用管理员身份运行CMD,输入netsh wins ...
- Linux Debian安装教程
Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建.它采用了自由软件协议,并且由志愿者社区维护和支持.Debian 的目标是创 ...
- Angular项目简单使用拦截器 httpClient 请求响应处理
1:为啥要使用拦截器 httpClient 请求响应处理,其作用我们主要是: 目前我的Angular版本是Angular 17.3,版本中实现请求和响应的拦截处理了.这种机制非常适合添加如身份验证头. ...
- 高通 LK阶段配置使用I2C-8
以MSM8953为例. 原文(有删改):https://blog.csdn.net/qq_29890089/article/details/108294710 项目场景 因为项目需要,需要在高通MSM ...
- QT学习:07 字符编码的问题
--- title: framework-cpp-qt-07-字符编码的问题 EntryName: framework-cpp-qt-07-char-coding date: 2020-04-13 1 ...