2017-01-12 3 views
0

Ich bin nicht wirklich sicher, der beste Weg, um dies zu tun, oder wenn ich nur für ein Leben, das einfacher als es sein soll fragen. Ich habe ein Backend für eine Webanwendung und schreibe alle Abfragen in Raw SQL. Zum Beispiel ein bestimmtes Benutzerprofil bekommen, oder eine Anzahl von Benutzern habe ich eine Abfrage wie folgt:Erstellen dynamischer SQL-Abfragen mit psycopg2 und postgresql

SELECT accounts.id, 
    accounts.username, 
    accounts.is_brony, 
WHERE accounts.id IN %(ids)s; 

Das ist wirklich schön, weil ich ein Benutzerprofil bekommen, oder viele Benutzerprofile mit der gleichen Abfrage. Jetzt ist meine echte Abfrage tatsächlich fast 50 Zeilen lang. Es hat viele Verknüpfungen und andere Bedingungen für dieses Profil.

Sagen wir, ich möchte alle die gleichen Informationen von einem Benutzerprofil erhalten, aber anstatt eine bestimmte Benutzer-ID zu erhalten, möchte ich einen einzigen zufälligen Benutzer bekommen? Ich finde es nicht sinnvoll, 50 Codezeilen zu kopieren und einzufügen, nur um am Ende zwei Zeilen zu ändern.

SELECT accounts.id, 
    accounts.username, 
    accounts.is_brony, 
ORDER BY Random() 
LIMIT 1; 

Gibt es eine Möglichkeit, eine Art der Vererbung in Erstellen von Abfragen zu verwenden, so dass am Ende kann ich ein paar Bedingungen ändern während des Kern die gleichen Ähnlichkeiten?

Ich bin mir sicher, dass ich es durch Verketten von Strings und so schaffen könnte, aber ich war neugierig, ob es eine allgemein akzeptierte Methode gibt, sich einer solchen Situation zu nähern. Google hat mich enttäuscht.

+0

Unterabfragen? Etwas wie 'Select * von () als Reihenfolge von random() limit 1;' – Abelisto

+0

das macht Sinn. ist die große Auswirkung auf die Leistung, wenn eine Abfrage in eine Unterabfrage eingefügt wird? Ich versuche es selbst zu testen, wenn ich ein bisschen Zeit habe. – DigitalDisaster

+0

Es ist abhängig von der "Kernabfrage" und Abfrageplaner. – Abelisto

Antwort

2

Die kanonische Antwort ist eine Ansicht zu erstellen und verwenden mit verschiedenen WHERE und ORDER BY Klauseln in Abfragen.

Aber, abhängig von Ihrer Anfrage und Ihren Tabellen, ist das vielleicht keine gute Lösung für Ihren Spezialfall.

Eine Abfrage, die mit WHERE accounts.id IN (1, 2, 3) blitzschnell ist, kann abgrundtief mit ORDER BY random() LIMIT 1 ausführen. In diesem Fall müssen Sie eine andere Abfrage für die zweite Anforderung erstellen.

+0

Danke. Das habe ich jetzt im Wesentlichen getan. Ich werde nur die Ergebnisse mit großen Mengen von Dummy-Daten testen müssen, um sicherzustellen, dass es keine zukünftigen Leistungsbedenken gibt. – DigitalDisaster

Verwandte Themen