Django model层之执行原始SQL查询

by:授客 QQ1033553122

测试环境

Win7

Django 1.11

 

执行原始SQL查询

Manager.raw(raw_queryparams=Nonetranslations=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查询的更多相关文章

  1. Django文档阅读之执行原始SQL查询

    Django提供了两种执行原始SQL查询的方法:可以使用Manager.raw()来执行原始查询并返回模型实例,或者可以完全避免模型层直接执行自定义SQL. 每次编写原始SQL时都要关注防止SQL注入 ...

  2. 在django中,执行原始sql语句

    extra()方法 结果集修改器,一种提供额外查询参数的机制 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where ...

  3. django不定义model,直接执行自定义SQL

    如果不想定义model,直接执行自定义SQL,可如下操作: 1. 通过 connections获取db连接,如果是多个数据库,connections['dbName'] 来选择 2. 获取游标 cur ...

  4. 12.Django数据库操作(执行原生SQL)

    1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1& ...

  5. 大数据技术之_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 ...

  6. SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?

    前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...

  7. django 执行原始SQL

    二.知识点总结 When the model query APIs don’t go far enough, you can fall back to writing raw SQL. go far ...

  8. 在sql server中怎样获得正在执行的Sql查询

    方法1:使用DBCC inputbuffer(spid) 使用SP_WHO获得SPID,然后再执行上面的DBCC command,参见下图 执行一段sql语句 打开另一个query窗口并执行SP_WH ...

  9. django框架 - 实时查看执行的sql语句

    django框架采用的ORM模型,我们可以通过mysql的日志记录实时看到执行的sql语句,具体步骤如下: 第一步:找到mysql的配置文件 第二步:编辑mysql配置文件 第三步:重启mysql 第 ...

  10. 【Django】Django 直接执行原始SQL 如何防止SQL注入 ?

    代码示例: #错误--不要直接格式化字符串 query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname Person.objec ...

随机推荐

  1. 【知识点】深入浅出STL标准模板库

    前几天谈论了许多关于数论和数据结构的东西,这些内容可能对初学者而言比较晦涩难懂(毕竟是属于初高等算法/数据结构的范畴了).今天打算来讲一些简单的内容 - STL 标准模板库. STL 标准模板库 C+ ...

  2. HTML——文件上传域

    文件上传是网站中一种常见的功能.例如百度网盘.QQ 邮箱以及有道云笔记都可以实现文件的上传.在 HTML 中,把 <input> 标签的 type 属性设置为 file 就可以实现上传文件 ...

  3. Linux中根据关键字获取某一行的行号

    [root@localhost ~]# cat test.txt 123213 ehualu.server ehualu.docker 10.0.0.10 ehualu.server ehualu.d ...

  4. ChatTTS,语气韵律媲美真人的开源TTS模型,文字转语音界的新魁首,对标微软Azure-tts

    前两天 2noise 团队开源了ChatTTS项目,并且释出了相关的音色模型权重,效果确实非常惊艳,让人一听难忘,即使摆在微软的商业级项目Azure-tts面前,也是毫不逊色的. ChatTTS是专门 ...

  5. ubuntu安装之后要做的10件事

    部分内容整理自网络,如果侵权还请联系 基础配置 换源 换源 [ubuntu清华源镜像站] ctrl+click,进入镜像站链接,选择合适的版本,将镜像地址粘贴到本地文件里,对于: <24.04的 ...

  6. android端http请求重发问题定位过程

    昨天生产系统上报出一个问题:用户做一次扫码交易,出现了两条交易记录.幸好支付渠道对支付码有限制只成功了一笔,没有出现多扣钱的问题.现在我们要排查一下,为什么做一次操作会出现两条交易记录.我们的后台服务 ...

  7. java 日期 时间

    方法一(线程不安全, 不建议使用)private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...

  8. 利用ADB获取APP资源

    最近小编经常受到失眠的困扰,因为在编写一个安卓体能评定的软件,同时又在构思一个桌面管理应用,不管是构想还是操作上都遇到了很多难题,所以寄希望于小编手机上的一款软件,因为版权问题,就不说出它叫啥名字了. ...

  9. pyenv-win 替换国内镜像源

    前情提要 今天心血来潮想学一学python 然后因为python版本众多,了解到了pyenv这个python版本管理器 在github下载好pyenv以后,打算先安装一个稳定的版本 pyenv ins ...

  10. Apollo quick start SampleApp demo Java

    <!--配置中心--> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <a ...