web-dev-qa-db-fra.com

Requêtes SQL brutes dans Django

Comment pourrais-je effectuer les opérations suivantes en utilisant du SQL brut dans views.py?

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))

À quoi ressemblerait cette fonction results?

27
David542
>>> 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

utilisez la clause WHERE pour filtrer le vote pour oui:

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

La documentation Django est vraiment très bonne. Vous avez essentiellement deux options pour exécuter du SQL brut. Vous pouvez utiliser Manager.raw() pour effectuer des requêtes brutes qui renvoient des instances de modèle, ou vous pouvez éviter la couche de modèle et exécuter directement du SQL personnalisé.

Utilisation du gestionnaire raw():

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

Si vous souhaitez contourner directement la couche modèle, vous pouvez utiliser Django.db.connection qui représente la connexion à la base de données par défaut:

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
43
zeekay

Vous pouvez essayer ceci

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 ")
1
Tinashe Robert