Allgemeine Frage: SQL-Strings in Python-Code oder außerhalb?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

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
Benutzeravatar
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.

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()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Als alternative: ein ORM verwenden. Dann hast du genau Null SQL-Strings, weder Innerhalb noch außerhalb deines Programmes.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Leonidas hat geschrieben:Als alternative: ein ORM verwenden. Dann hast du genau Null SQL-Strings, weder Innerhalb noch außerhalb deines Programmes.
Damit hast du ja was angerichtet ... :roll:

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 :wink:
Leonidas
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten