Django ORM的騷操作
阿新 • • 發佈:2021-08-10
1. Django ORM執行原生SQL
在模型查詢API不夠用的情況下,我們還可以使用原始的SQL語句進行查詢。
Django 提供兩種方法使用原始SQL進行查詢:一種是使用raw()方法,進行原始SQL查詢並返回模型例項;另一種是完全避開模型層,直接執行自定義的SQL語句。
-
執行原生查詢
raw()管理器方法用於原始的SQL查詢,並返回模型的例項:
注意:raw()語法查詢必須包含主鍵。
這個方法執行原始的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語句:
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): ... print(p)
raw()查詢可以查詢其他表的資料。
舉個例子:
ret = models.Student.objects.raw('select id, tname as hehe from app02_teacher') for i in ret: print(i.id, i.hehe)
raw()方法自動將查詢欄位對映到模型欄位。還可以通過translations引數指定一個把查詢的欄位名和ORM物件例項的欄位名互相對應的字典
d = {'tname': 'haha'} ret = models.Student.objects.raw('select * from app02_teacher', translations=d) for i in ret: print(i.id, i.sname, i.haha)
原生SQL還可以使用引數,注意不要自己使用字串格式化拼接SQL語句,防止SQL注入!
d = {'tname': 'haha'} ret = models.Student.objects.raw('select * from app02_teacher where id > %s', translations=d, params=[1,]) for i in ret: print(i.id, i.sname, i.haha)
- 直接執行自定義SQL
有時候raw()方法並不十分好用,很多情況下我們不需要將查詢結果對映成模型,或者我們需要執行DELETE、 INSERT以及UPDATE操作。在這些情況下,我們可以直接訪問資料庫,完全避開模型層。
我們可以直接從django提供的介面中獲取資料庫連線,然後像使用pymysql模組一樣操作資料庫。
from django.db import connection, connections cursor = connection.cursor() # cursor = connections['default'].cursor() cursor.execute("""SELECT * from auth_user where id = %s""", [1]) ret = cursor.fetchone()
2. Django終端列印SQL語句
在Django專案的settings.py檔案中,在最後複製貼上如下程式碼:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
3. 在Python指令碼中呼叫Django環境
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() from app01 import models books = models.Book.objects.all() print(books)每天逼著自己寫點東西,終有一天會為自己的變化感動的。這是一個潛移默化的過程,每天堅持編編故事,自己不知不覺就會擁有故事人物的特質的。 Explicit is better than implicit.(清楚優於含糊)