欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django執(zhí)行原生SQL查詢的實(shí)現(xiàn)

 更新時(shí)間:2021年08月08日 16:31:42   作者:y大壯  
本文主要介紹了django執(zhí)行原生SQL查詢的實(shí)現(xiàn),主要有兩種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

執(zhí)行原生 SQL 查詢

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

  • 你可以使用 Manager.raw() 來 執(zhí)行原生查詢并返回模型實(shí)例。
  • 或者完全不用模型層 直接執(zhí)行自定義 SQL。

1、執(zhí)行原生查詢

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

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

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

1.1 普通查詢

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

然后你可以像這樣執(zhí)行自定義 SQL:

for p in Person.objects.raw('SELECT * FROM app_person'): # django默認(rèn)的表名是app名加類名
    print(p)
​# 沒有查詢到就報(bào)錯(cuò)

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')

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

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

只要名字對(duì)上了,模型實(shí)例就會(huì)被正確創(chuàng)建。

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

>>> 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() 支持索引,所以,若你只需要第一個(gè)結(jié)果就這樣寫:

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

1.4 將參數(shù)傳給 raw()

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

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

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

2、直接執(zhí)行自定義 SQL

繞過模型層。

對(duì)象 django.db.connection 代表默認(rèn)數(shù)據(jù)庫連接。要使用這個(gè)數(shù)據(jù)庫連接,調(diào)用 connection.cursor() 來獲取一個(gè)指針對(duì)象。然后,調(diào)用 cursor.execute(sql, [params]) 來執(zhí)行該 SQL 和 cursor.fetchone(),或 cursor.fetchall() 獲取結(jié)果數(shù)據(jù)。

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 注入,你絕對(duì)不能在 SQL 字符串中用引號(hào)包裹 %s 占位符。
注意,若要在查詢中包含文本的百分號(hào),你需要在傳入?yún)?shù)使用兩個(gè)百分號(hào):

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

2.1 指定連接數(shù)據(jù)庫

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

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

 到此這篇關(guān)于django執(zhí)行原生SQL查詢的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)django執(zhí)行原生SQL查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 虛擬環(huán)境venv詳解

    Python 虛擬環(huán)境venv詳解

    Python 虛擬環(huán)境主要是為不同 Python 項(xiàng)目創(chuàng)建一個(gè)隔離的環(huán)境,每個(gè)項(xiàng)目都可以擁有獨(dú)立的依賴包環(huán)境,而項(xiàng)目間的依賴包互不影響,對(duì)Python 虛擬環(huán)境venv相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • pandas的排序和排名的具體使用

    pandas的排序和排名的具體使用

    這篇文章主要介紹了pandas的排序和排名的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 如何用python給數(shù)據(jù)加上高斯噪聲

    如何用python給數(shù)據(jù)加上高斯噪聲

    這篇文章主要介紹了如何用python給數(shù)據(jù)加上高斯噪聲問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼

    python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了python 處理微信對(duì)賬單數(shù)據(jù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Django中的WebSocket實(shí)時(shí)通信的實(shí)現(xiàn)小結(jié)

    Django中的WebSocket實(shí)時(shí)通信的實(shí)現(xiàn)小結(jié)

    在Django中,使用WebSocket可以實(shí)現(xiàn)實(shí)時(shí)通信,例如聊天應(yīng)用、實(shí)時(shí)更新等,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Django中使用第三方登錄的示例代碼

    Django中使用第三方登錄的示例代碼

    這篇文章主要介紹了Django中使用第三方登錄的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • python簡(jiǎn)單實(shí)現(xiàn)基于SSL的IRC bot實(shí)例

    python簡(jiǎn)單實(shí)現(xiàn)基于SSL的IRC bot實(shí)例

    這篇文章主要介紹了python簡(jiǎn)單實(shí)現(xiàn)基于SSL的IRC bot,實(shí)例分析了IRC機(jī)器人的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • python函數(shù)指定默認(rèn)值的實(shí)例講解

    python函數(shù)指定默認(rèn)值的實(shí)例講解

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python函數(shù)指定默認(rèn)值的實(shí)例講解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-03-03
  • Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    這篇文章主要介紹了Python3.7黑帽編程之病毒篇(基礎(chǔ)篇),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Flask中jinja2的繼承實(shí)現(xiàn)方法及實(shí)例

    Flask中jinja2的繼承實(shí)現(xiàn)方法及實(shí)例

    在本篇文章里小編給大家分享的是一篇關(guān)于Flask中jinja2的繼承實(shí)現(xiàn)方法及實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03

最新評(píng)論