好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > django執(zhí)行原生SQL查詢的實現

django執(zhí)行原生SQL查詢的實現

熱門標簽:西青語音電銷機器人哪家好 成都呼叫中心外呼系統(tǒng)哪家強 旅游廁所地圖標注怎么弄 百應電話機器人總部 地圖標注與注銷 宿州電話機器人哪家好 無錫智能外呼系統(tǒng)好用嗎 南昌地圖標注 電梯新時達系統(tǒng)外呼顯示e

執(zhí)行原生 SQL 查詢

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

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

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

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

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

該方法接受一個原生 SQL 查詢語句,執(zhí)行它,并返回一個 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(...)

然后你可以像這樣執(zhí)行自定義 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''')

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

或者,你可以用 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()

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

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

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

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

繞過模型層。

對象 django.db.connection 代表默認數據庫連接。要使用這個數據庫連接,調用 connection.cursor() 來獲取一個指針對象。然后,調用 cursor.execute(sql, [params]) 來執(zhí)行該 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執(zhí)行原生SQL查詢的實現的文章就介紹到這了,更多相關django執(zhí)行原生SQL查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • django執(zhí)行原始查詢sql,并返回Dict字典例子
  • 在Django的模型中執(zhí)行原始SQL查詢的方法

標簽:辛集 渭南 七臺河 雅安 濰坊 西安 贛州 許昌

巨人網絡通訊聲明:本文標題《django執(zhí)行原生SQL查詢的實現》,本文關鍵詞  django,執(zhí)行,原生,SQL,查詢,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《django執(zhí)行原生SQL查詢的實現》相關的同類信息!
  • 本頁收集關于django執(zhí)行原生SQL查詢的實現的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 酒店回应成年子女不能与父母住标间| 4438全国最大成人网| 韩漫无遮挡在线观看| 538在线观看| 最黄毛片| 91??丨PORNY丨成人| 日韩视频高清| 宣城市| 亚洲熟妇无码aV在线观看网址 | 国产精品久久久久久精品三级古代| 女全身裸无遮挡免费毛片| 狠狠色噜噜狠狠狠狠2018| 男女强吻摸下面揉叫| 肌肉男的巨大粗爽gv网站| 99久久精品国产亚洲| 色戒删减完整| 胸前两个馒头| 在线观看人成网站深夜免费| 韩国片婬乱一级毛片a| 男女插插软件| 国产成人无码A片V99麻豆| 无遮挡亲胸捏胸激吻视频| 冰块和棉签怎么弄女孩子| 狠狠干91| 高清电影资源免费观看| 成人午夜高潮免费视频妓女| 8x8x深夜影院男生| 美熟丰满老妇女bbw| 一区二区三区欧美电影| 女性私密紧致水多的危害| 日本肉体xxxx69xxxx| 男生桶女生机机| 国产又爽又黄?免费智库| 苍井空色欲迷墙未删减| 国产熟睡乱子伦视频观看看| 国产jizzjizz视频免费看| 97色噜噜噜刺激有声小说| PANS雨涵写真福利二区| 久久精品视频日本| 好好的日视频| 亚洲成a人片在线观看网站口工|