1. 程式人生 > 其它 >Django ORM的騷操作

Django ORM的騷操作

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.(清楚優於含糊)