django系列5.4--ORM中執行原生SQL語句, Python腳本中調用django環境

ORM執行原生sql語句

在模型查詢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)

若是你想經過本身建立的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)
相關文章
相關標籤/搜索