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

Django中如何直接執(zhí)行SQL語句

 更新時間:2023年08月24日 09:55:34   作者:程序員學編程  
這篇文章主要介紹了Django中如何直接執(zhí)行SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Django直接執(zhí)行SQL語句

今天在django views.py看到同事寫的代碼里面有段關(guān)于數(shù)據(jù)庫查詢的語句。

因為涉及多個表的查詢,所以django 的models的查詢無法滿足需求,所以直接執(zhí)行了SQL語句。

他是按照下面的方法實現(xiàn)的。

    try:
        connection = MySQLdb.connect(host=SQL_IP,
                                     user=SQL_USER,
                                     passwd=SQL_PASSWD,
                                     db=SQL_DB, charset='utf8')
        cursor = connection.cursor()
        cmd_query = query_data(request)
        data_sort = sort_data(request)
        cmd = "set session group_concat_max_len = 8000;"
        cursor.execute(cmd)
        ......

看到這段代碼,感覺應(yīng)該重復(fù)造了輪子,數(shù)據(jù)庫的鏈接應(yīng)該交由django這個框架處理的。于是查看了下官方文檔。

django.db.connection 就是上面的同事寫的那個connection了。

后面的方法同他的一樣執(zhí)行就是了。即執(zhí)行

connection.cursor()
cursor.execute(sql, [params])
cursor.fetchone() or cursor.fetchall()

下面是一個簡單的例子。

from django.db import connection
def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()
    return row

如果你項目中有多個數(shù)據(jù)庫的話,django.db.connection也能很方便的選取數(shù)據(jù)庫。

django.db.connections 是一個類字典的結(jié)構(gòu),允許你使用數(shù)據(jù)庫別名獲取connection。

from django.db import connections
with connections['my_db_alias'].cursor() as cursor:
    # Your code here...

使用with作為上下文管理器:

with connection.cursor() as c:
    c.execute(...)

和下面這段代碼等效

c = connection.cursor()
try:
    c.execute(...)
finally:
    c.close()

注意的問題:

如果你做了更新或者插入操作需要在代碼中使用 :transaction.commit_unless_managed() 來提交數(shù)據(jù)。

或者使用事務(wù)裝飾器(例如 commit_on_success)來修飾視圖和提供事務(wù)控制數(shù)據(jù)提交。

這樣就不用在代碼中調(diào)用transaction.commit_unless_managed()。

但是,如果你不手動提交修改,你需要使用 transaction.set_dirty() 將事務(wù)標識為已臟。

使用 Django ORM 對數(shù)據(jù)庫進行修改時,Django 會自動調(diào)用 set_dirty() 。

但如果你使用了原始 SQL ,Django 就無法獲得你的 SQL 是否修改了數(shù)據(jù)。

只有手動調(diào)用 set_dirty() 才能確保 Django 知曉哪些修改必須被提交。

from django.db.transaction import commit_on_success
@commit_on_success
def my_custom_sql_view(request, value):
    from django.db import connection, transaction
    cursor = connection.cursor()
    # Data modifying operation
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value])
    # Since we modified data, mark the transaction as dirty
    transaction.set_dirty()
    # Data retrieval operation. This doesn't dirty the transaction,
    # so no call to set_dirty() is required.
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value])
    row = cursor.fetchone()
    #transaction.commit_unless_managed()
    return render_to_response('template.html', {'row': row})

如果不使用

參考文獻:1、https://docs.djangoproject.com/en/2.0/topics/db/sql/

Django底層實現(xiàn)sql語句

在django中我們可以自己手寫底層sql語句,那么如何寫呢?

#導(dǎo)入原生sql模塊
from django.db import connection
# 獲取當前用戶關(guān)注課程列表
def get_myflow(request):
    # 獲取用戶id
    uid = request.GET.get('id')
    # 建立游標對象
    cursor = connection.cursor()
    # 鏈表查詢
    cursor.execute('select a.username,c.title from user a left join flows b on a.id=b.uid left join course c on b.cid=c.id where a.id = %s'% uid)
    # 獲取結(jié)果集
    result = dictfetchall(cursor)
    print(result)
    # 返回結(jié)果
    return HttpResponse(json.dumps(result),content_type='application/json')

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實現(xiàn)的微信好友數(shù)據(jù)分析功能示例

    Python實現(xiàn)的微信好友數(shù)據(jù)分析功能示例

    這篇文章主要介紹了Python實現(xiàn)的微信好友數(shù)據(jù)分析功能,結(jié)合實例形式分析了Python使用itchat、pandas、pyecharts等模塊針對微信好友數(shù)據(jù)進行統(tǒng)計與計算相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • python配置grpc環(huán)境

    python配置grpc環(huán)境

    gRPC 是一款高性能、開源的 RPC 框架,產(chǎn)自 Google,基于 ProtoBuf 序列化協(xié)議進行開發(fā),支持多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 安裝使用
    2019-01-01
  • Python 依賴庫太多了該如何管理

    Python 依賴庫太多了該如何管理

    在 Python 的項目中,如何管理所用的全部依賴庫呢?最主流的做法是維護一份“requirements.txt”,記錄下依賴庫的名字及其版本號,需要的朋友可以參考下
    2019-11-11
  • Python實現(xiàn)圖片分割的多種方法總結(jié)

    Python實現(xiàn)圖片分割的多種方法總結(jié)

    圖片分割是圖像處理中的一個重要任務(wù),它的目標是將圖像劃分為多個區(qū)域或者對象,本文為大家整理了一些常用的分割方法,大家可以根據(jù)需求自行選擇
    2025-04-04
  • Python實現(xiàn)將單張或多張圖片轉(zhuǎn)PDF

    Python實現(xiàn)將單張或多張圖片轉(zhuǎn)PDF

    這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)將單張或多張圖片轉(zhuǎn)PDF,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-11-11
  • python求最大值最小值方法總結(jié)

    python求最大值最小值方法總結(jié)

    在本篇內(nèi)容里小編給大家分享了關(guān)于python求最大值最小值方法以及實例內(nèi)容,有興趣的朋友們學習下。
    2019-06-06
  • 基于Python+Pygame實現(xiàn)經(jīng)典賽車游戲

    基于Python+Pygame實現(xiàn)經(jīng)典賽車游戲

    這篇文章主要為大家分享了一個基于Python和Pygame實現(xiàn)的賽車小游戲,文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下
    2022-04-04
  • Tkinter使用Progressbar創(chuàng)建和管理進度條的操作代碼

    Tkinter使用Progressbar創(chuàng)建和管理進度條的操作代碼

    Progressbar是Tkinter庫中的一個小部件,用于創(chuàng)建和管理進度條,這篇文章主要介紹了Tkinter使用Progressbar創(chuàng)建和管理進度條,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 利用Python程序讀取Excel創(chuàng)建折線圖

    利用Python程序讀取Excel創(chuàng)建折線圖

    這篇文章主要介紹了利用Python程序讀取Excel創(chuàng)建折線圖,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • PyCharm中的terminal運行從PS修改成cmd方式

    PyCharm中的terminal運行從PS修改成cmd方式

    這篇文章主要介紹了PyCharm中的terminal運行從PS修改成cmd方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論

南平市| 湄潭县| 洛隆县| 吉隆县| 青海省| 马山县| 南阳市| 通渭县| 育儿| 安义县| 郁南县| 富裕县| 鄯善县| 南皮县| 成武县| 滕州市| 西峡县| 肇州县| 那曲县| 卓资县| 同仁县| 女性| 长宁县| 虎林市| 宿迁市| 金乡县| 黄梅县| 罗山县| 永安市| 黎平县| 德安县| 玉溪市| 淮南市| 行唐县| 都江堰市| 息烽县| 景东| 波密县| 祁东县| 唐山市| 根河市|