2016-12-10 6 views
0

Ich möchte folgende SQL-Abfrage in Django verwenden, aber ich konnte das nicht verwenden, nachdem ich direkt mit Raw SQL versucht habe. Das SQL funktioniert direkt während der Ausführung im PostgreeSQL Abfragefenster, aber auf Django hat es nicht funktioniert.Wie schreibe ich eine rohe SQL-Abfrage in Django QuerySet?

Das SQL soll vor 22522 einen unmittelbar niedrigeren Wert finden. Ich möchte das im QuerySet Format oder in Raw SQL verwenden. SQL-Abfrage unten

hinzugefügt
SELECT id, name, zip FROM region WHERE zip>=(SELECT max(zip) FROM region 
WHERE zip<22522) AND zip<=(SELECT min(zip) FROM region WHERE zip>22522) 
ORDER BY zip ASC LIMIT 1 

Hier ist der Code, den ich im Raw-Abfrageformat verwendet habe. Ich sah, jede andere einfache SQL-Abfrage innerhalb der c.execute() Druckergebnisdaten korrekt.

from django.db import connection 

with connection.cursor() as c: 
    c.execute("SELECT id, name, zip FROM region WHERE zip>=(SELECT max(zip) 
    FROM region WHERE zip<22522) AND zip<=(SELECT min(zip) FROM region 
    WHERE zip>22522) ORDER BY zip ASC LIMIT 1") 

    for row in c.fetchall(): 
     print(row[1]) 
+0

Was ist der Fehler (bitte vollständige Rückverfolgung) – thebjorn

+0

Es gibt keinen Grund, warum Sie keine rohe Abfrage verwenden sollten. Aber anstatt einen Cursor zu verwenden, mache MyModel.objects.raw (..), das dir immer noch die volle Macht für Django gibt. – e4c5

Antwort

0

Um das Ergebnis zurück in QuerySet Format erhalten Sie mit einem Djano Modell starten müssen, zum Beispiel:

class Person(models.Model): 
    first_name = models.CharField(...) 
    last_name = models.CharField(...) 
    birth_date = models.DateField(...) 

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

Weitere Einzelheiten finden Sie auf der Django-Dokumentation unter: Django Documentation