}]
,"msg": "show successfully"
,"error_tag": 0
}
用connection庫 和原生的sql語句讀資料庫,如下:
from django.db import connection # 匯入connection
sql_str =
"select * from book"
# str型別的原生sql語句
cursor = connection.cursor(
)# 用建立好的connection物件建立cursor游標物件
cursor.execute(sql_str)
# 執行自定義sql語句
datainfo = cursor.fetchall(
)# 取出執行返回的記錄,返回的tuple型別資料
cursor.close()# 執行完,關閉
connection.close(
)
上述操作可寫成:
from django.db import connection
sql_str =
"select * from book"
with connection.cursor(
)as cursor # with語句用於資料庫操作
cursor.execute(sql_str)
datainfo = cursor.fetchall(
)
用connection庫 和原生的sql語句寫資料庫時,要注意:
1、connection.commit(
)# 增刪改操作要提交事務給connection物件,它改變了資料庫值。
2、pymysql中可以設定游標為字典型別,django中不行,需要自行封裝
游標(cursor)是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果,主要用於處理和接收資料,可方便的對資料庫進行增、刪、改、查等各種操作。
django中model.objects.filter()返回的是list,而sql執行後返回的是tuple,且django中不像pymsql可以直接指定cursor的型別,因此,我們自行要封裝,使返回的型別保持一致,具體如下:
def
dict_fetchall
(cursor)
:# cursor是執行sql_str後的記錄,作入參
columns =
[col[0]
for col in cursor.description]
# 得到域的名字col[0],組成list
return
[dict
(zip
(columns, row)
)for row in cursor.fetchall()#
]
zip(columns,row) # 把列表columns和元組row兩兩對應組合,返回的是tuple資料
dict(zip(columns,row)) # 把tuple轉成dict鍵值對,返回的generator物件
[dict(zip(columns, row)) for row in cursor.fetchall()] # 轉成list
>> dict(zip(元組1,元組2,元組3)) # 三個引數會報錯如下
>> valueerror: dictionary update sequence element 0 has length 3; 2 is required
with connection.cursor(
)as cursor:
cursor.execute(sql)
datainfo = dict_fetchall(cursor)
# 呼叫上面的dict_fetchall()方法
return datainfo
最後datainfo返回的資料形式如data:
,,
]"msg": "show successfully"
,"error_tag": 0
}
django中使用原生sql操作第三方庫之django.db的connection庫
pymsql中執行sql語句:
自行封裝執行結果:
Django之ORM執行原生sql語句
django 中的orm 提供的操作功能有限,在模型提供的查詢 api不能滿足實際工作需要時,可以在 orm中直接執行原生sql語句。django 提供兩種方法使用原生sql進行查詢 一種是使用raw 方法,進行原生sql查詢並返回模型例項 另一種是完全避開模型層,直接執行自定義的sql語句。raw...
Django執行原生SQL
hey,各位小夥伴,這次怎麼來玩一下,如何使用django執行原生sql 我們都知道,python在web界的扛把子,django,可謂是集大成為統一,各種各樣的外掛程式,forms元件,model模型,admin後台 反正就是乙個字,nb 本次就來學一下,如何在django執行原生語句 在使用dj...
django執行原生sql
一 orm row 方法 只能實現查詢 d list models.article.objects.raw select nid,count nid as num,strftime y m create time as ctime from blog article where user id st...