最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月01日 08:41:55   作者:xushuai110  
這篇文章主要介紹了django執(zhí)行原始查詢sql,并返回Dict字典例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

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

當(dāng)然你還可以

import json
json.dumps(result )

返回一串json數(shù)據(jù),是不是很完美。。。

# coding:utf-8
from django.db import connection, transaction

'''執(zhí)行django原始sql語句 并返回一個(gè)數(shù)組對(duì)象'''
def executeQuery(sql):
 cursor = connection.cursor() # 獲得一個(gè)游標(biāo)(cursor)對(duì)象
 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 = {}
  # 把每一行的數(shù)據(jù)遍歷出來放到Dict中
  for index, value in enumerate(row):
  print index, col_names[index], value
  objDict[col_names[index]] = value

  result.append(objDict)

 return result


補(bǔ)充知識(shí):重寫django的mysql驅(qū)動(dòng)實(shí)現(xiàn)原生sql語句查詢返回字典類型數(shù)據(jù)

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

這里使用的方法是繼承django.db.backends.mysql驅(qū)動(dòng)

首先在django項(xiàng)目下創(chuàng)建一個(gè)mysql文件夾,然后在這個(gè)文件夾下創(chuàng)建base.py。

base.py

from django.db.backends.mysql import base
from django.db.backends.mysql import features
from 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項(xiàng)目的settings.py文件里修改數(shù)據(jù)庫配置的數(shù)據(jù)庫引擎

DATABASES = {
 'default': {
  'ENGINE': 'Test.mysql', # 指定數(shù)據(jù)庫驅(qū)動(dòng)為剛剛創(chuàng)建的mysql文件夾
  'NAME': 'test', # 指定的數(shù)據(jù)庫名
  'USER': 'root', # 數(shù)據(jù)庫登錄的用戶名
  'PASSWORD': '123456', # 登錄數(shù)據(jù)庫的密碼
  'HOST': '127.0.0.1',
  'PORT': '3306', # 數(shù)據(jù)庫服務(wù)器端口,mysql默認(rèn)為3306
  'DATABASE_OPTIONS': {
   'connect_timeout': 60,
   'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
   'charset': 'utf8mb4',
  },
 }
}

測(cè)試

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)

輸出結(jié)果

[{'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__方法

獲取連接對(duì)象的游標(biāo)是由DatabaseWrapper類的create_cursor返回的。所以只需要重寫create_cursor方法,就可以更改游標(biāo)返回的數(shù)據(jù)類型了。

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

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

到這里,理論上已經(jīng)完成了重寫目標(biāo),但是在測(cè)試的時(shí)候出錯(cuò)了,在django.db.backends.mysql.features.DatabaseFeatures里的is_sql_auto_is_null_enabled方法報(bào)出KeyError的錯(cuò)誤。

 @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方法使用了重寫后的游標(biāo),cursor.execute('SELECT @@SQL_AUTO_IS_NULL')返回的結(jié)果不是元組,而是一個(gè)字典。所以result[0]會(huì)報(bào)出KeyError的錯(cuò)誤。重寫is_sql_auto_is_null_enabled方法把result[0]改成result['@@SQL_AUTO_IS_NULL']就可以了.

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

以上這篇django執(zhí)行原始查詢sql,并返回Dict字典例子就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python+wxPython實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂播放器

    Python+wxPython實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂播放器

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編程語言和wxPython模塊創(chuàng)建一個(gè)簡(jiǎn)單的音樂播放器,文中的示例代碼講解詳細(xì),感興趣的可以了解下
    2023-09-09
  • Python更新所有安裝的包的實(shí)現(xiàn)方式

    Python更新所有安裝的包的實(shí)現(xiàn)方式

    這篇文章主要介紹了Python更新所有安裝的包的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • python中使用iterrows()對(duì)dataframe進(jìn)行遍歷的實(shí)例

    python中使用iterrows()對(duì)dataframe進(jìn)行遍歷的實(shí)例

    今天小編就為大家分享一篇python中使用iterrows()對(duì)dataframe進(jìn)行遍歷的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Opencv實(shí)現(xiàn)鼠標(biāo)事件與窗口互動(dòng)功能過程

    Opencv實(shí)現(xiàn)鼠標(biāo)事件與窗口互動(dòng)功能過程

    平時(shí)在做圖像處理demo或者研究測(cè)試算法時(shí),經(jīng)常會(huì)用到imshow和鼠標(biāo)的交互,比如在顯示圖像的窗口上畫點(diǎn)、線、圓、矩形、多邊形等操作,故在此做出用法總結(jié)
    2022-12-12
  • 詳解python破解zip文件密碼的方法

    詳解python破解zip文件密碼的方法

    這篇文章主要介紹了python破解zip文件密碼的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 如何利用Python將字典轉(zhuǎn)為成員變量

    如何利用Python將字典轉(zhuǎn)為成員變量

    當(dāng)我們?cè)赑ython中寫一個(gè)class時(shí),如果有一部分的成員變量需要用一個(gè)字典來命名和賦值,此時(shí)應(yīng)該如何操作呢?這篇文章主要給大家介紹了關(guān)于如何利用Python將字典轉(zhuǎn)為成員變量的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • python實(shí)現(xiàn)哈希表

    python實(shí)現(xiàn)哈希表

    介紹一個(gè)用python實(shí)現(xiàn)的哈希表,處理沖突的方法是開放地址法,沖突表達(dá)式為Hi=(H(key)+1)mod m,m為表長(zhǎng)。遲點(diǎn)再實(shí)現(xiàn)更難的拉鏈法
    2014-02-02
  • Python?Pandas實(shí)現(xiàn)將嵌套JSON數(shù)據(jù)轉(zhuǎn)換DataFrame

    Python?Pandas實(shí)現(xiàn)將嵌套JSON數(shù)據(jù)轉(zhuǎn)換DataFrame

    對(duì)于復(fù)雜的JSON數(shù)據(jù)進(jìn)行分析時(shí),通常的做法是將JSON數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為Pandas?DataFrame,所以本文就來看看將嵌套JSON數(shù)據(jù)轉(zhuǎn)換為Pandas?DataFrame的具體方法吧
    2024-01-01
  • Python入門教程之運(yùn)算符重載詳解

    Python入門教程之運(yùn)算符重載詳解

    運(yùn)算符重載意味著賦予超出其預(yù)定義的操作含義的擴(kuò)展含義。例如運(yùn)算符 + 用于添加兩個(gè)整數(shù)以及連接兩個(gè)字符串和合并兩個(gè)列表。本文將通過示例帶大家詳細(xì)了解Python的運(yùn)算符重載,感興趣的可以了解一下
    2022-09-09
  • 如何解決import torchvision報(bào)錯(cuò)問題 DLL:找不到模塊

    如何解決import torchvision報(bào)錯(cuò)問題 DLL:找不到模塊

    這篇文章主要介紹了如何解決import torchvision報(bào)錯(cuò)問題 DLL:找不到模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

松江区| 随州市| 门源| 卓资县| 肥乡县| 汾西县| 静海县| 农安县| 泗阳县| 米泉市| 杨浦区| 台州市| 昌吉市| 兴城市| 防城港市| 苏州市| 赞皇县| 霍林郭勒市| 安丘市| 辰溪县| 贵州省| 新建县| 洪江市| 绵竹市| 金平| 白银市| 宜州市| 措勤县| 嘉禾县| 太康县| 兴宁市| 贵阳市| 竹山县| 龙山县| 沙田区| 民丰县| 青岛市| 墨江| 巍山| 福建省| 鹤山市|