2011-05-09 85 views
19

如何在views.py中使用raw sql執行以下操作?Django視圖中的原始sql查詢

from app.models import Picture 

def results(request): 
    all = Picture.objects.all() 
    yes = Picture.objects.filter(vote='yes').count() 
    return render_to_response('results.html', {'picture':picture, 'all':all, 'yes': yes}, context_instance=RequestContext(request)) 

這個結果函數是什麼樣的?謝謝。

+3

爲什麼你想在過濾使用原始的SQL爲查詢和統計? – DTing 2011-05-09 01:51:16

+10

這種情況沒有實際的理由。只是爲了看/知道如何去做。 – David542 2011-05-09 02:46:55

回答

34
>>> from django.db import connection 
>>> cursor = connection.cursor() 
>>> cursor.execute('''SELECT count(*) FROM people_person''') 
1L 
>>> row = cursor.fetchone() 
>>> print row 
(12L,) 
>>> Person.objects.all().count() 
12 

使用WHERE子句過濾投票的是:

>>> cursor.execute('''SELECT count(*) FROM people_person WHERE vote = "yes"''') 
1L 
+0

非常有用!謝謝!我用'rows = cursor.fetchall()'。 – mescarra 2017-05-12 15:29:46

+0

@mescarra Thankyou發佈此問題。 (2L,u'Division B:Mining')(3L,u'Division C)(012) :建築')(4L,u'Division D:製造')。你是如何設法從u和L中分離出更多價值的? 謝謝。 – Simer 2017-09-21 11:23:38

31

The Django Documentation is really really good.基本上有兩個選項可以執行原始SQL。您可以使用Manager.raw()執行返回模型實例的原始查詢,也可以避免模型層並直接執行自定義SQL。

使用raw()經理:

>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): 
...  print p 
John Smith 
Jane Jones 

如果你想繞過模型層,直接就可以使用django.db.connection它代表了默認的數據庫連接:

def my_custom_sql(): 
    from django.db import connection, transaction 
    cursor = connection.cursor() 

    # Data modifying operation - commit required 
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) 
    transaction.commit_unless_managed() 

    # Data retrieval operation - no commit required 
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) 
    row = cursor.fetchone() 

    return row 
+1

+1好的解釋,你能用raw返回一個數嗎? – DTing 2011-05-09 03:04:13

+0

不,它返回一個'RawQuerySet',它只在你想返回一個模型實例時纔有用。要執行'count(*)'或其他你不想返回模型實例的東西,最好使用'django.db.connection'。 – zeekay 2011-05-09 03:17:57

0

你可以試試這個

Picture.objects.raw("SELECT 1 as id ,"\ 
"(SELECT count(*) as yes FROM people_person WHERE vote='yes') as yes ,"\ 
"(SELECT count(*) FROM people_person WHERE vote='no') as no ,"\ 
"(SELECT count(*) FROM people_person WHERE vote='all') as all ")