中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django怎么執行原生SQL查詢

發布時間:2021-08-09 02:17:58 來源:億速云 閱讀:318 作者:chen 欄目:開發技術

本篇內容介紹了“django怎么執行原生SQL查詢”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 執行原生 SQL 查詢

  • 1、執行原生查詢

    • 1.1 普通查詢

    • 1.2 將查詢字段映射為模型字段

    • 1.3 索引查詢

    • 1.4 將參數傳給 raw()

  • 2、直接執行自定義 SQL

    • 2.1 指定連接數據庫

執行原生 SQL 查詢

Django 允許你用兩種方式執行原生 SQL 查詢:

  • 你可以使用 Manager.raw() 來 執行原生查詢并返回模型實例。

  • 或者完全不用模型層 直接執行自定義 SQL。

1、執行原生查詢

管理器方法 raw() 能用于執行原生 SQL 查詢,就會返回模型實例:

Manager.raw(raw_query, params=None, translations=None)

該方法接受一個原生 SQL 查詢語句,執行它,并返回一個 django.db.models.query.RawQuerySet 實例。這個 RawQuerySet 能像普通的 QuerySet 一樣被迭代獲取對象實例。

1.1 普通查詢

class Person(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    birth_date = models.DateField(...)

然后你可以像這樣執行自定義 SQL:

for p in Person.objects.raw('SELECT * FROM app_person'): # django默認的表名是app名加類名
    print(p)
# 沒有查詢到就報錯

1.2 將查詢字段映射為模型字段

raw() 字段將查詢語句中的字段映射至模型中的字段。
查詢語句中的字段排序并不重要。換而言之,以下兩種查詢是一致的:

Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM app_person')

Person.objects.raw('SELECT last_name, birth_date, first_name, id FROM app_person')

匹配是根據名字來的。這意味著你可以使用 SQL 的 AS 子句將查詢語句中的字段映射至模型中的字段。所以,若你還有一些數據表包含了 Person 數據,你可以很方便的將其映射至 Person 實例:

>>> Person.objects.raw('''SELECT first AS first_name,
...                              last AS last_name,
...                              bd AS birth_date,
...                              pk AS id,
...                       FROM app_person''')

只要名字對上了,模型實例就會被正確創建。

或者,你可以用 raw() 的 translations 參數將查詢語句中的字段映射至模型中的字段。這是一個字典,將查詢語句中的字段名映射至模型中的字段名。例如,上面的查詢也能這樣寫:

>>> name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
>>> Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)

1.3 索引查詢

raw() 支持索引,所以,若你只需要第一個結果就這樣寫:

>>> first_person = Person.objects.raw('SELECT * FROM app_person')[0]

1.4 將參數傳給 raw()

如果你需要執行參數化的查詢,可以使用 raw() 的 params 參數:

>>> lname = 'Doe'
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])

params 是一個參數字典。你將用一個列表替換查詢字符串中 %s 占位符,或用字典替換 %(key)s 占位符(其中, key 理所應當由字典 key 替換),不論你使用哪個數據庫引擎。這些占位符會被 params 參數的值替換。
!!!必須以列表形式傳入參數,格式一定是這樣寫,不能寫成字符串

2、直接執行自定義 SQL

繞過模型層。

對象 django.db.connection 代表默認數據庫連接。要使用這個數據庫連接,調用 connection.cursor() 來獲取一個指針對象。然后,調用 cursor.execute(sql, [params]) 來執行該 SQL 和 cursor.fetchone(),或 cursor.fetchall() 獲取結果數據。

from django.db import connection

def my_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

要避免 SQL 注入,你絕對不能在 SQL 字符串中用引號包裹 %s 占位符。
注意,若要在查詢中包含文本的百分號,你需要在傳入參數使用兩個百分號:

cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' AND id = %s", [self.id])

2.1 指定連接數據庫

用 django.db.connections 獲取指定數據庫的連接(和指針)。 django.db.connections 是一個類字典對象,它允許你通過連接別名獲取指定連接:

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

“django怎么執行原生SQL查詢”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南充市| 同德县| 翼城县| 合阳县| 浠水县| 蛟河市| 靖州| 九龙坡区| 定州市| 锡林郭勒盟| 庐江县| 马鞍山市| 睢宁县| 新巴尔虎左旗| 洪洞县| 五家渠市| 八宿县| 建瓯市| 沛县| 通海县| 宁安市| 桃园市| 钟祥市| 泾川县| 临沭县| 勐海县| 麦盖提县| 杭州市| 仁寿县| 宁陕县| 永年县| 宁化县| 枝江市| 三门峡市| 青铜峡市| 新和县| 拜城县| 陵川县| 时尚| 嘉善县| 阜平县|