Ich versuche, den besten Weg zum Formatieren einer SQL-Abfragezeichenfolge zu finden. Wenn ich meine Anwendung debugge, möchte ich mich anmelden, um alle SQL-Abfragezeichenfolgen abzulegen, und es ist wichtig, dass die Zeichenfolge ordnungsgemäß formatiert ist.
Option 1
def myquery():
sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
con = mymodule.get_connection()
...
- Dies ist gut zum Drucken der SQL-Zeichenfolge.
- Es ist keine gute Lösung, wenn die Zeichenfolge lang ist und nicht der Standardbreite von 80 Zeichen entspricht.
Option 2
def query():
sql = """
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
Hier ist der Code klar, aber wenn Sie die SQL-Abfragezeichenfolge drucken, erhalten Sie all diese nervigen Leerzeichen.
u '\ nSelect feld1, field2, field3, Field4 \ n_ _ ___ aus Tabelle \ n _ ___ wo condition1 = 1 \ n _ ___ _and condition2 = 2'
Hinweis: Ich habe Leerzeichen durch Unterstriche ersetzt _
, da sie vom Editor abgeschnitten werden
Option 3
def query():
sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
- Ich mag diese Option nicht, weil sie die Klarheit des gut tabellierten Codes beeinträchtigt.
Option 4
def query():
sql = "select field1, field2, field3, field4 " \
"from table " \
"where condition1=1 " \
"and condition2=2 "
con = mymodule.get_connection()
...
- Ich mag diese Option nicht, weil all die zusätzlichen Eingaben in jeder Zeile und es schwierig ist, die Abfrage auch zu bearbeiten.
Für mich wäre die beste Lösung Option 2, aber ich mag die zusätzlichen Leerzeichen nicht, wenn ich die SQL-Zeichenfolge drucke.
Kennen Sie andere Möglichkeiten?
quelle
Antworten:
Es tut mir leid, dass ich in einem so alten Thread gepostet habe - aber als jemand, der auch eine Leidenschaft für pythonisches "Bestes" teilt, dachte ich, ich würde unsere Lösung teilen.
Die Lösung besteht darin, SQL-Anweisungen mithilfe der String Literal Concatenation ( http://docs.python.org/ ) von Python zu erstellen , die irgendwo zwischen Option 2 und Option 4 qualifiziert werden können
Codebeispiel:
Funktioniert auch mit F-Strings :
Vorteile:
quelle
"""
undtextwrap.dedent()
vor der Ausgabe zu verwenden"sql query"
, um ein Durcheinander mit SQL-Zeichenfolgen zu vermeiden (die standardmäßig einfache Anführungszeichen verwenden)?Sie haben offensichtlich viele Möglichkeiten in Betracht gezogen, die SQL so zu schreiben, dass sie in Ordnung gedruckt wird. Wie wäre es jedoch, wenn Sie die für die Debug-Protokollierung verwendete 'print'-Anweisung ändern, anstatt Ihre SQL auf eine Weise zu schreiben, die Sie nicht mögen? Wie wäre es mit einer Protokollierungsfunktion wie dieser, wenn Sie oben Ihre bevorzugte Option verwenden:
Dies würde es auch trivial machen, zusätzliche Logik hinzuzufügen, um die protokollierte Zeichenfolge auf mehrere Zeilen aufzuteilen, wenn die Zeile länger als die gewünschte Länge ist.
quelle
Die sauberste Art und Weise, auf die ich gestoßen bin, ist vom SQL-Styleguide inspiriert .
Im Wesentlichen sollten die Schlüsselwörter, mit denen eine Klausel beginnt, rechtsbündig und die Feldnamen usw. linksbündig sein. Dies sieht sehr ordentlich aus und ist auch einfacher zu debuggen.
quelle
Wenn der Wert der Bedingung eine Zeichenfolge sein soll, können Sie Folgendes tun:
quelle
format()
mit SQL-Zeichenfolgen abfinden, ist dies ein wichtiger Codegeruch.where condition1=:field1
und anschließende Übergabe der Werte als Parameter. Wenn Sie verwenden.format()
, gibt es eine Möglichkeit, ein';DROP TABLE Users
in Ihr SQL einzufügen. In PEP-249 erfahren Sie, wie Sie Parameter richtig verwenden. python.org/dev/peps/pep-0249/#paramstyleUm eine Formatierung vollständig zu vermeiden , ist es meiner Meinung nach eine gute Lösung, Verfahren zu verwenden .
Wenn Sie eine Prozedur aufrufen, erhalten Sie das Ergebnis jeder Abfrage, die Sie in diese Prozedur einfügen möchten . Sie können tatsächlich mehrere Abfragen innerhalb einer Prozedur verarbeiten. Der Aufruf gibt nur die zuletzt aufgerufene Abfrage zurück .
MYSQL
Python
quelle
Sie könnten die Feldnamen in ein Array "Felder" einfügen und dann:
quelle
Ich würde vorschlagen, bei Option 2 zu bleiben (ich verwende sie immer für Abfragen, die komplexer sind als
SELECT * FROM table
), und wenn Sie sie auf nette Weise drucken möchten, können Sie immer ein separates Modul verwenden .quelle
Für kurze Abfragen, die in eine oder zwei Zeilen passen, verwende ich die String-Literal-Lösung in der oben genannten Lösung mit der höchsten Bewertung. Bei längeren Abfragen teile ich sie in
.sql
Dateien auf. Ich benutze dann eine Wrapper-Funktion, um die Datei zu laden und das Skript auszuführen, so etwas wie:Natürlich lebt dies oft in einer Klasse, so dass ich normalerweise nicht
cursor
explizit bestehen muss. Ich benutze auch allgemeincodecs.open()
, aber dies vermittelt die allgemeine Idee. Dann sind SQL-Skripte vollständig in ihren eigenen Dateien enthalten und haben eine eigene Syntaxhervorhebung.quelle
[In Antwort auf Kommentar bearbeiten]
Eine SQL-Zeichenfolge in einer Methode zu haben, bedeutet NICHT, dass Sie sie "tabellieren" müssen:
quelle
select
. Meine Antwort hat keine führenden Leerzeichen. Was hat Sie dazu gebracht, sich die Meinung zu bilden, dass sie gleich sind?