Stringverarbeitung: Zeichen zwischen Elementen einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo zusammen,


da ich gerade in Python SQL Querys mit variablen attributen zusammenschustere, und
das selbst für mich sehr unpythonisch aussieht wollte ich fragen, ob von euch
da vielleicht was schöneres kennt?

ich habe zum Beispiel folgende Liste

Code: Alles auswählen

selectFields = [(id),(name),(typ)...]
und diese muss ich in folgende Form für das Statement umbauen
select id, name, typ, ....
Das Problem ist hier bekanntlich das Komma (bzw. and, or), ansonsten würde das "schön" über eine iterationsliste gehen.

Bei einer map wie

Code: Alles auswählen

whereMap = [typ:defect, prio:high....]
ist das noch unschöner.


Anbei ein Auszug aus meinem Code

Code: Alles auswählen

def performce_Report_Query(self,selectFields, whereFields, orderFields):
    query = "select "
    
....

    if (len(whereFields) > 0):
        query = "%s where "%query
        andSwitch = 0;
        for key in whereFields.iter():
            if (andSwitch == 0):
                andSwitch = 1
                query = "%s %s = '%s'"%(query,key[0],whereFields.get(key)[0])
            else:
                query = "%s and %s = '%s'"%(query,key[0],whereFields.get(key)[0])
   
 ....
        
    return __execute_SQL_Query_and_Feedback(self,True, query)
Ist nicht dringend, aber ich würde das gerne doch etwas schöner schreiben. Gibts z.b. sowas wie ein list.toString() und ich müsste nur die Klammern wegschneiden?

Schonmal vielen dank

Grüße
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Theoretisch sollte das doch über "".join() realisierbar sein.

Generell handelst Du Dir natürlich die Gefahr eine SQL-Injection ein. Ggf. ist es da besser doch einen ORM wie SQLAlchemy zu verwenden bei so viel Dynamik in den Anfragen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

kennst du die _maximale_ Länge der Liste? Wenn ja, kannst du die Listen mit 1 auffüllen und die "korrekte" Ersetzung mit SQL-Query vornehmen.

Grund: Queries wie

Code: Alles auswählen

cursor.exectue("SELECT foo FROM bar WHERE spam=%s AND %s AND s%", ('egg','1','1'))
sind erlaubt (zumindest bei MySQL). Das "AND 1" macht halt nichts...

Ist aber sicherlich keine "state-of-the-art" Lösung. ;-)

Gruß, noisefloor
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das `if` hat keine Klammern um die Bedingung, Befehle werden nicht mit `;` abgeschlossen und Wahrheitswerte sollten `True` und `False` und nicht 0 und 1 benutzen. Ansonsten würde ich's so machen:

Code: Alles auswählen

def build_query(where_fields):
    ...
    if where_fields:
        query += " where %s" % " and ".join("%s = '%s'" % item for item in where_fields.items())
    ...

build_query({'a': '1', 'b': '2'))
Stefan
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo und schonmal vielen Dank für die Vorschläge.

@sma. Opala, da ist mal wieder meine java heimat durchgebrochen, zum glück ist der Compiler sehr tolerant bei sowas. Habe das aber natürlich geändert.

Das mit .join ist eine tolle Idee welche ich sofort ausprobieren werde.

Vielen Dank und ein schönes Wochenende

Stefan
Antworten