在模型查詢API不夠用的狀況下,咱們還可使用原始的SQL語句進行查詢。python
Django 提供兩種方法使用原始SQL進行查詢:一種是使用raw()方法,進行原始SQL查詢並返回模型實例;另外一種是徹底避開模型層,直接執行自定義的SQL語句。 <br/>mysql
raw()管理器方法用於原始的SQL查詢,並返回模型的實例:sql
注意:raw()語法查詢必須包含主鍵。數據庫
這個方法執行原始的SQL查詢,並返回一個django.db.models.query.RawQuerySet 實例。 這個RawQuerySet 實例能夠像通常的QuerySet那樣,經過迭代來提供對象實例。django
舉個例子:app
class Person(models.Model): first_name = models.CharField(...) last_name = models.CharField(...) birth_date = models.DateField(...)
能夠像下面這樣執行原生SQL語句fetch
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): ... print(p)
raw()查詢能夠查詢其餘表的數據。spa
舉個例子:code
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)
<br/> ###直接執行自定義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()
若是你想經過本身建立的python文件在django項目中使用django的models,那麼就須要調用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)