Django提供兩種方式執行(performing)原始的SQL查詢:
(1) 、 Manager.raw() :執行原始查詢並返回模型實例
(2) 、 Executing custom SQL directly :直接執行自定義SQL,這種方式可以完全避免數據模型,而是直接執行原始的SQL語句。
三、raw()方法
The raw() manager method can be used to perform raw SQL queries that return model instances:
Manager. raw ( raw_query , params=None , translations=None )
用法:
>>> for p in Person.objects.raw('SELECT * FROM Person LIMIT 2'): ... print p John Smith Jane Jones
注意,原始SQL裡的model,如果在 db_table 沒有定義,則使用app的名稱,後面下劃線 後面接模型類的名稱,如"Myblog_New";上面的例子,在定義類的時候已經這樣處理了:
Class New(models.Model): ...... ...... #自定義表名 class Meta: db_table = 'New'
2、查詢字段隱射到模型字段(Mapping query fields to model fields)
raw() automatically maps fields in the query to fields on the model.並且是通過名稱來匹配,這意味著我們可以使用SQL子句(clause)
>>> Person.objects.raw('''SELECT first AS first_name, ... last AS last_name, ... bd AS birth_date, ... pk as id, ... FROM some_other_table''')
返回一個RawQuerySet對象
3、索引查找(Index lookups)
first_person = Person.objects.raw('SELECT * from myapp_person')[0] first_person = Person.objects.raw('SELECT * from myapp_person LIMIT 1')[0] #然而,索引和切片不是在數據庫級別上執行(除LIMIT外)
4、延遲模型字段(Deferring model fields)
Fields may also be left out(left out:忽視,不考慮;被遺忘),這意味著該字段的查詢將會被排除在根據需要時的加載。
>>> for p in Person.objects.raw('SELECT id, first_name FROM myapp_person'): ... print p.first_name, # 這將檢索到原始查詢 ... print p.last_name # 這將檢索需求 ... John Smith Jane Jones
這個例子其實檢索了三個字段,一個主鍵(必需)、一個原始SQL字段、一個需求字段。這裡主鍵字段不能省略,否則會出錯,如下:
5、傳遞參數(Passing parameters into raw() )
如果需要執行參數化查詢,您可以使用params參數原始()
注意兩點: (1)、
(2)、必須使用[參數],否則出錯:
(3)、這種方式不對:
Error: >>> query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname >>> Person.objects.raw(query)
四、直接執行自定義SQL
Manager.raw() 遠遠不夠,可直接執行自定義SQL,directly execute UPDATE , INSERT , or DELETE queries.
django.db.connection:代表默認的數據庫連接
django.db.transaction :代表默認數據庫事務(transaction)
用database connection調用 connection.cursor() 得到一個游標(cursor)對象。
然後調用 cursor.execute(sql, [params]) 執行SQL
cursor.fetchone() 或者 cursor.fetchall(): 返回結果行如果執行修改操作,則調用 transaction.commit_unless_managed()來保證你的更改提交到數據庫。
def my_custom_sql(): from django.db import connection, transaction cursor = connection.cursor() # 數據修改操作——提交要求 cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) transaction.commit_unless_managed() # 數據檢索操作,不需要提交 cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) row = cursor.fetchone() return row
django.db.connections :針對使用多個數據庫
from django.db import connections cursor = connections['my_db_alias'].cursor() # Your code here... transaction.commit_unless_managed(using='my_db_alias')
通常我們不需要手動調用 transaction.commit_unless_managed( ),我們可以這樣做:
@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() return render_to_response('template.html', {'row': row})
查看Django ORM執行的SQL語句 : connection.queries
下面關於Python的文章您也可能喜歡,不妨看看:
Python:在指定目錄下查找滿足條件的文件 http://www.linuxidc.com/Linux/2015-08/121283.htm
Python2.7.7源碼分析 http://www.linuxidc.com/Linux/2015-08/121168.htm
無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡