Hallo,
ich möchte mal eine allgemeinere Diskussion über die Unterbringung komplexerer (z.B. mit Unterabfragen) und damit umfangreicherer SQL-Strings anstoßen. Bislang bringe ich sie alle im Quelltext unter, an oder in der Näher der Stelle, an der sie benötigt werden. Ich finde allerdings, daß größere Blöcke SQL im Pythoncode nicht unbedingt zu dessen Lesbarkeit beitragen. Als Alternative dachte ich bislang daran, die SQL-Strings gesammelt in einer separaten Textdatei unterzubringen, diese dann irgendwann einzulesen und im Quelltext dann an der richtigen Stelle nur noch den Namen der Stringkonstanten zu verwenden. Dies erschwert aber unter Umständen das Verständnis des Codeabschnitts, weil die Information, welche Felder zu erwarten sind, nun mehr an ganz anderer Stelle zu finden ist. Eine weitere Idee wäre die Verwendung von StoredProcs oder ähnlichem, was ich aber aus verteilungstechnischen Gründen als eher ungünstig empfinde.
Wie handhabt ihr das?
Gruß
Jan-Peer
Allgemeine Frage: SQL-Strings in Python-Code oder außerhalb?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jan-Peer!
Wie du ja schon bemerkt hast, sind SQL-Anweisungen Teil des Programms. Und wenn du sie aulagerst, dann wird es schwieriger, dem Programmverlauf zu folgen.
Bei mir kommen richtig große SQL-Anweisungen jeweils in eine eigene Textdatei in den Unterordner *sql*. Kleine bis mittlere (das ist reine Gefühlssache) bleiben im Quellcode. Außerdem empfinde ich das gar nicht als so unlesbar. Im Gegenteil.
mfg
Gerold

Wie du ja schon bemerkt hast, sind SQL-Anweisungen Teil des Programms. Und wenn du sie aulagerst, dann wird es schwieriger, dem Programmverlauf zu folgen.
Bei mir kommen richtig große SQL-Anweisungen jeweils in eine eigene Textdatei in den Unterordner *sql*. Kleine bis mittlere (das ist reine Gefühlssache) bleiben im Quellcode. Außerdem empfinde ich das gar nicht als so unlesbar. Im Gegenteil.
Code: Alles auswählen
sql = """
SELECT
first_name,
last_name
FROM
(
SELECT
first_name,
last_name
FROM
addresses_1
UNION ALL
SELECT
first_name,
last_name
FROM
addresses_2
) uni_addresses
ORDER BY
last_name,
first_name
"""
cur.execute(sql)
for first_name, last_name in cur:
print repr(first_name), repr(last_name)
cur.close()
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Damit hast du ja was angerichtet ...Leonidas hat geschrieben:Als alternative: ein ORM verwenden. Dann hast du genau Null SQL-Strings, weder Innerhalb noch außerhalb deines Programmes.

Mir war dieses Konzept bis gestern überhaupt nicht bekannt. SQLAlchemy hatte ich zwar schon immer wieder mal gehört, aber immer ignoriert. Jetzt beschäftige ich mich seit Stunden mit dem Lesen der Dokumentation und bin so begeistert, daß ich ernsthaft überlege, es für ein laufendes Projekt zu verwenden (mit dem ich folglich in den letzten Stunden auch nicht wirklich weiter gekommen bin, aber das bisschen zusätzliche Verspätung wird jetzt wohl auch nichts mehr ausmachen ...)
Wie gesagt, ich wühle mich durch die Dokumentation, fühle mich aber zunehmend etwas verloren. Egal, man wird mich schon wiederfinden, irgendwann ...
Danke auf jeden Fall erst einmal, und ich melde mich wieder, wenn ich jemanden brauche, der mir den Strick hält

-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Auch wenn SQLAlchemy das wohl mit Abstand featurereichste ORM ist, kann es sein, dass du mit Storm oder SQLObject besser dran bist, weil sie einfacher zu nutzen sind. Allerdings hatte ich so das Gefühl, dass immer mehr SQLObject-Projekte zu SQLAlchemy migrieren.
Naja, jedenfalls wünsch ich dir schon mal viel Erfolg.
Naja, jedenfalls wünsch ich dir schon mal viel Erfolg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice