2011-05-09 89 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 ")