django中sql語句的查詢

2021-07-06 05:43:25 字數 2892 閱讀 5302

執行原始sql查詢

當 模型查詢api 不要走得足夠遠,你 可以回到寫原始sql。 django提供了兩種方式執行原始 sql查詢:您可以使用 manager.raw() 來 執行原始查詢和 回歸模型例項 ,或者你可以完全避免模型層 執行自定義sql直接 。

執行原始查詢

的 生() 經理的方法可以用來執行原始的sql查詢 回歸模型例項:

經理。 生 ( raw_query , params =沒有 , 翻譯=沒有 )

這個方法方法接受乙個原始sql查詢,執行它,並返回乙個 django.db.models.query.rawqueryset 例項。 這 rawqueryset 例項 可以遍歷就像正常queryset提供物件例項。

這是最好的說明了乙個例子。 假設你有以下模型:

class person(models.model):

first_name = models.charfield(...)

last_name = models.charfield(...)

birth_date = models.datefield(...)

然後您可以執行自定義sql

print(p)

>>>john smith

>>>jane jones

這個例子不是非常令人興奮的——它是一模一樣 執行 person.objects.all() 。 然而, 生() 有一些其他的嗎 選項,使它非常強大。

模型表名

的名字**來的 人 表來自例子嗎?

詳情檢視的文件 db_table 選項,也可以手動設定 資料庫表的名稱。

警告沒有完成檢查傳遞給sql語句 .raw() 。 django預計的語句會返回一組行 資料庫,但是並沒有執行。 如果查詢沒有 返回行,(可能的)錯誤的結果。

查詢字段對映到領域模型

生() 自動查詢中的字段對映到領域模型。

查詢欄位的順序並不重要。 換句話說,兩個 下面的查詢工作相同:

>>> person.objects.raw('''select first as first_name,

last as last_name,

bd as birth_date,

pk as id,

from some_other_table''')

只要名字匹配,將正確建立模型例項。

或者,您可以查詢中的字段對映到模型領域使用 翻譯 引數 生() 。 這是乙個字典對映的名字 查詢中的欄位名稱的領域模型。 例如,上面的 查詢也可以寫成:

>>> name_map = 

>>> person.objects.raw('select * from some_other_table', translations=name_map)

索引查詢

生() 支援索引,因此,如果您只需要第乙個結果 寫:

然而,索引和切片並不在資料庫級別上執行。 如果 你有乙個大的 人 資料庫中的物件,它是更多 有效限制查詢在sql級:

延遲模型領域

字段可能也被排除在外:

的 人 這個查詢返回的物件將被延遲模型例項 (見 推遲() )。 這意味著 字段省略從查詢將被載入到需求。 例如:

>>> 

print(p.first_name, # this will be retrieved by the original query

p.last_name) # this will be retrieved on demand

john smith

jane jones

從外表,這看起來像查詢檢索 第一名和姓。 然而,這個例子其實發行3 查詢。 只有第乙個名字被生()檢索查詢的 姓都檢索時印刷的需求。

只有乙個領域,你不能離開——主鍵 字段。 django使用主鍵來確定模型例項,所以它 必須始終包含在原始查詢。 乙個 invalidquery 異常 將提高如果你忘了包括主鍵。

新增注釋

您還可以執行查詢定義不包含字段 模型。 例如,我們可以使用 postgresql的年齡()函式 得到乙個列表 的人與他們的年齡計算的資料庫:

>>>

for p in people:

print("%s is %s." % (p.first_name, p.age))

john is

37.jane is

42.傳遞引數到 生()

如果你需要進行引數化查詢,您可以使用 引數個數 引數 生() :

>>> lname = 'doe'
引數個數 的引數是乙個列表或字典。 您將使用 % s 在查詢字串中佔位符的列表,或 %(關鍵) (佔位符一本詞典 關鍵 取而代之的是乙個 當然,字典鍵),不管你的資料庫引擎。 這樣的 佔位符將被替換的引數 引數個數 論點。

請注意字典引數不支援使用sqlite

字典引數不支援sqlite的後端; 這個後台,你必須通過引數作為乙個列表。

警告不要使用在原始查詢字串格式化!

人們很容易把上面的查詢寫成:

>>> person.objects.raw(query)

不喜歡。

使用 引數個數 論點完全保護你 sql注入 攻擊 ,乙個攻擊者任意sql注入的共同開發 您的資料庫。 如果你使用字串插值,遲早你會 sql注入的受害者。 只要你記得總是使用 引數個數 論證你會保護。

改變了django 1.6:

在django 1.5和更早的,你可以通過引數作為字典 當使用postgresql或mysql,儘管這不是記錄。 現在 您還可以使用oracle這樣做的時候,這是官方支援。

直接執行自定義的sql

有時甚至 manager.raw() 沒有足夠的:你可能需要 執行查詢,不簡潔地對映到模型,或直接執行 更新 , 插入 ,或 刪除 查詢。

在django中使用sql語句查詢

django中提供了乙個raw 方法來使用sql語句進行查詢 class person models.model first name models.charfield max length 50 last name models.charfield max length 50 birth date...

django中使用原生SQL語句查詢

django使用原生sql語句查詢兩種方式 raw查詢 例項 查詢租房專案的經理人資訊 agent.objects.raw sql語句 返回乙個物件,但是還沒有繞過orm框架使用django中的connections來寫sql語句 from django.db import connections ...

PHP中查詢sql語句

1 sql查詢語句 描述 表示去資料庫中指定的表內根據條件查詢指定的內容。語法 sql select 資訊 from 哪張表 where 查詢條件 說明 資訊 有兩種寫法 一是 寫 星號,代表查詢所有字段對應的資訊 sql select from friendslist where 1 二是寫指定字...