电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

django執行原始查詢sql,并返回Dict字典例子

瀏覽:12日期:2024-10-14 10:39:16

很多時候執行sql語句,數據比django的model來的快,但并不想關心返回的字段,例如你可以執行:select * from product這種sql,這里個方法將會返回與數據庫列名相同的鍵值對 ,格式是這樣子的:

result = [{“id”:1,”name”:”product1”},{“id”:2,”name”:”product2”}]

當然你還可以

import json json.dumps(result )

返回一串json數據,是不是很完美。。。

# coding:utf-8from django.db import connection, transaction’’’執行django原始sql語句 并返回一個數組對象’’’def executeQuery(sql): cursor = connection.cursor() # 獲得一個游標(cursor)對象 cursor.execute(sql) rawData = cursor.fetchall() print rawData col_names = [desc[0] for desc in cursor.description] print col_names result = [] for row in rawData: objDict = {} # 把每一行的數據遍歷出來放到Dict中 for index, value in enumerate(row): print index, col_names[index], value objDict[col_names[index]] = value result.append(objDict) return result

補充知識:重寫django的mysql驅動實現原生sql語句查詢返回字典類型數據

在使用django的時候,有些需求需要特別高的查詢效率,所以需要使用原生的sql語句查詢,但是查詢結果一般是一個元組嵌套元組。為了處理方便,需要從數據庫查詢后直接返回字典類型的數據。

這里使用的方法是繼承django.db.backends.mysql驅動

首先在django項目下創建一個mysql文件夾,然后在這個文件夾下創建base.py。

base.py

from django.db.backends.mysql import basefrom django.db.backends.mysql import featuresfrom django.utils.functional import cached_property class DatabaseFeatures(features.DatabaseFeatures): @cached_property def is_sql_auto_is_null_enabled(self): with self.connection.cursor() as cursor: cursor.execute(’SELECT @@SQL_AUTO_IS_NULL’) result = cursor.fetchone() return result and result[’@@SQL_AUTO_IS_NULL’] == 1 class DatabaseWrapper(base.DatabaseWrapper): features_class = DatabaseFeatures def create_cursor(self, name=None): cursor = self.connection.cursor(self.Database.cursors.DictCursor) return base.CursorWrapper(cursor) @cached_property def mysql_server_info(self): with self.temporary_connection() as cursor: cursor.execute(’SELECT VERSION()’) return cursor.fetchone()[’VERSION()’]

最后在django項目的settings.py文件里修改數據庫配置的數據庫引擎

DATABASES = { ’default’: { ’ENGINE’: ’Test.mysql’, # 指定數據庫驅動為剛剛創建的mysql文件夾 ’NAME’: ’test’, # 指定的數據庫名 ’USER’: ’root’, # 數據庫登錄的用戶名 ’PASSWORD’: ’123456’, # 登錄數據庫的密碼 ’HOST’: ’127.0.0.1’, ’PORT’: ’3306’, # 數據庫服務器端口,mysql默認為3306 ’DATABASE_OPTIONS’: { ’connect_timeout’: 60, ’init_command’: 'SET sql_mode=’STRICT_TRANS_TABLES’', ’charset’: ’utf8mb4’, }, }}

測試

from django.db import connections def f(): search_sql = 'SELECT propertyphotoid,propertyid,alykey FROM lansi_architecture_data.propertyphoto limit 0,5' cursor = connections[’default’].cursor() try: cursor.execute(search_sql) rows = cursor.fetchall() except Exception as e: print(e) rows = 1 print(rows)

輸出結果

[{’propertyphotoid’: 27, ’propertyid’: 0, ’alykey’: ’123456’}, {’propertyphotoid’: 28, ’propertyid’: 10837, ’alykey’: ’Property/6113/207504A1-AC65-4E3B-BE86-538B3807D364’}, {’propertyphotoid’: 29, ’propertyid’: 6113, ’alykey’: ’Property/6113/357A4EAE-750A-4F59-AF01-271B4225CFBD’}, {’propertyphotoid’: 31, ’propertyid’: 6113, ’alykey’: ’Property/6113/6DF1A2C1-F54C-4462-8363-619806A2F085’}, {’propertyphotoid’: 36, ’propertyid’: 6113, ’alykey’: ’Property/6113/572CB245-ABC0-4FD6-8353-729EBD5E5D46’}]

源碼解析:

django.db.utils.ConnectionHandler的__getitem__方法

django執行原始查詢sql,并返回Dict字典例子

獲取連接對象的游標是由DatabaseWrapper類的create_cursor返回的。所以只需要重寫create_cursor方法,就可以更改游標返回的數據類型了。

django.db.backends.mysql.base.DatabaseWrapper類中的create_cursor方法如下:

def create_cursor(self, name=None): cursor = self.connection.cursor() return CursorWrapper(cursor)

到這里,理論上已經完成了重寫目標,但是在測試的時候出錯了,在django.db.backends.mysql.features.DatabaseFeatures里的is_sql_auto_is_null_enabled方法報出KeyError的錯誤。

@cached_property def is_sql_auto_is_null_enabled(self): with self.connection.cursor() as cursor: cursor.execute(’SELECT @@SQL_AUTO_IS_NULL’) result = cursor.fetchone() return result and result[0] == 1

原因是is_sql_auto_is_null_enabled方法使用了重寫后的游標,cursor.execute(’SELECT @@SQL_AUTO_IS_NULL’)返回的結果不是元組,而是一個字典。所以result[0]會報出KeyError的錯誤。重寫is_sql_auto_is_null_enabled方法把result[0]改成result[’@@SQL_AUTO_IS_NULL’]就可以了.

最后還需要把DatabaseWrapper類里的features_class賦值為重寫后的DatabaseFeatures類。

以上這篇django執行原始查詢sql,并返回Dict字典例子就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
主站蜘蛛池模板: 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 99文库_实习生实用的范文资料文库站 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 自动配料系统_称重配料控制系统厂家| 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 小型手持气象站-空气负氧离子监测站-多要素微气象传感器-山东天合环境科技有限公司 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 |