Django model层之执行原始SQL查询

简介: Django model层之执行原始SQL查询

Django model层之执行原始SQL查询


 

测试环境

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__)

 

 

 

目录
相关文章
|
25天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
16 0
sql语句加正则 简化查询
|
2月前
|
SQL
sql server链接查询
sql server链接查询
18 1
|
2月前
|
SQL
sql server简单查询
sql server简单查询
15 1
|
1月前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
15 0
|
2月前
|
SQL
sql高级查询
sql高级查询
15 0
|
2月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
4天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
5天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
9天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
10 0
|
10天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句