3 Stimmen

django/python: raw sql mit mehreren Tabellen

Ich muss eine Raw Sql für mehrere Tabellen durchführen. Dann rendere ich die Ergebnismenge. Für eine Tabelle würde ich tun:

sql = "select * from my_table"
results = my_table.objects.raw(sql)

Für mehrere Tabellen tue ich das:

sql = "select * from my_table, my_other_table where ...."
results = big_model.objects.raw(sql)

Aber muss ich wirklich eine Tabelle/Modell/Klasse big_model erstellen, die alle Felder enthält, die ich möglicherweise benötige? Ich werde niemals Daten in dieser "Tabelle" speichern.

HINZUFÜGEN:

Ich habe eine Tabelle my_users. Ich habe eine Tabelle my_listings. Diese sind in Models.py definiert. Die Tabelle my_listings hat einen Fremdschlüssel zu my_users, der angibt, wer die Liste erstellt hat.

Die SQL lautet

"select user_name, listing_text from my_listings, my_users where my_users.id = my_listings.my_user_id". 

Ich möchte diese SQL eine Ergebnismenge zu generieren, die ich verwenden können, um meine Seite in Django zu rendern.

Die Frage ist: Muss ich ein Modell erstellen, das die Felder user_name und listing_text enthält? Oder gibt es einen besseren Weg, der immer noch rohes SQL verwendet (select, from, where)? Natürlich sind meine tatsächlichen Abfragen komplizierter als dieses Beispiel. (Die Modelle, die ich in models.py definiere, werden zu tatsächlichen Tabellen in der Datenbank, daher die Verwendung des Begriffs model/table. Ich weiß nicht, wie ich sie sonst bezeichnen soll, tut mir leid.) Ich verwende raw sql, weil ich festgestellt habe, dass Python-Tabellenreferenzen nur mit einfachen Datenmodellen funktionieren.

2voto

user984003 Punkte 25601
  1. Das funktioniert. Ich weiß nicht, warum es vorher nicht funktionierte :( Aus dem Kommentar von Dennis Baker:

Sie brauchen NICHT ein Modell mit allen Feldern, sondern nur das erste Modell und die Felder daraus. Sie müssen die Felder mit eindeutigen Namen haben, und soweit ich weiß, sollten Sie "tablename.field as fieldname" verwenden, um sicherzustellen, dass Sie alle eindeutigen Felder haben. Ich habe einige ziemlich komplexe Abfragen mit mehr als 5 Tabellen auf diese Weise durchgeführt und sie immer mit einem einzigen Modell verknüpft. -

2 . Eine andere Lösung ist die Verwendung eines Cursors. Ein Cursor muss jedoch von einer Liste von Tupeln zu einer Liste von Wörterbüchern geändert werden. Sicherlich gibt es sauberere Lösungen mit Iteratoren, aber diese Funktion funktioniert. Sie nimmt einen String, also die rohe SQL-Abfrage, und gibt eine Liste zurück, die gerendert und in einer Vorlage verwendet werden kann.

from django.db import connection, transaction

def sql_select(sql):
    cursor = connection.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    list = []
    i = 0
    for row in results:
        dict = {} 
        field = 0
        while True:
           try:
                dict[cursor.description[field][0]] = str(results[i][field])
                field = field +1
            except IndexError as e:
                break
        i = i + 1
        list.append(dict) 
    return list

0voto

akonsu Punkte 27382

Sie brauchen kein Modell, das die Felder enthält, die Sie aus Ihrer Raw-Sql-Datei zurückgeben möchten. Wenn Sie zufällig ein Modell haben, das die Felder enthält, die Sie von Ihrem Raw-Sql zurückgeben wollen, dann können Sie Ihre Raw-Sql-Ausgabe diesem Modell zuordnen, ansonsten können Sie Cursors um Modelle ganz zu umgehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X