SQL Syntax vereinfachen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich möchte Werte aus einer Tabelle holen, damit diese neu berechnet werden können und diese dann wieder zurück schreiben. Meine Routine sieht wie folgt aus und funktioniert auch:

Code: Alles auswählen

def makeNextAuftrag (werte):
    ergebnis = getAuftragById (werte)
    connection = opendb()
    cursor = connection.cursor()
    for row in ergebnis:
        pass
    
    auftrag = schedaddle.next ((int (row[1]), int (row[2]), int (row[3]),
        int (row[4]), int (row[5])), 
        str (row[6])
        )
    
    werte = {
        "auftrags_id"   : row [0],
        "year_next"     : auftrag [0],
        "month_next"    : auftrag [1],
        "day_next"      : auftrag [2],
        "hour_next"     : auftrag [3],
        "minute_next"   : auftrag [4]
        }
        
    # errechnete werte zurück in die tabelle schreiben
    cursor.execute ("""update auftraege set
        year_next=:year_next, month_next=:month_next, day_next=:day_next,
        hour_next=:hour_next, minute_next=:minute_next
        where auftrags_id=:auftrags_id""", werte )
    connection.commit ()
Allerdings bin ich damit irgendwie nicht zu frieden. Das ganze sieht eher doppelt gemoppelt aus und ziemlich unübersichtlich. Bin recht neu in der Datenbankprogrammierung und fand eigentlich die Übergabe mit einem Dictionary immer ganz Vorteilhaft. Des weiteren versuche ich mir einen eigener maßen Programmierstil anzugewöhnen. Daher meine Frage, würdest Ihr, Datenbankabfragen genau so schreiben?
deets

Die SQL-Syntax ist doch voellig OK.

Was horribel aussieht ist das schedaddle.next, und die ganze Row-indiziererei.

Manche DB-Adapter erlauben, Rows als dictionaries zurueckzugeben. Das waere schonmal schicker. Andere geben mit ihrem Cursor ein Meta-Daten-Objekt zurueck, welches die Spaltennamen enthhaelt. Dann kann man ein dict damit bauen, etwa so (prototypisch):

Code: Alles auswählen

row = dict((name, value) for name, value in zip(cursor.rownames, row))
Wie gesagt, rownames ist einfach nur von mir ausgedacht, wie es konkret heisst haengt von deinem DB-Adapter ab.

Ausserdem finde ich den Seiteneffekt, den du ausnutz, um row zu bekommen ziemlich fies - zu erst habe ich gedacht, du benutzt es gar nicht! Stattdessen solltest du entweder gleich die richtige Zeile raussuchen, oder

row = list(cursor)[-1]

machen. Dann ist wenigens klar, woher row kommt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

row = list(cursor)[-1]
Ich hatte für row erst eine Schleife, allerdings brauche ich die nicht, da ich ja eh nur einen Datensatz zurück bekomme. Ich meine es, kam mir ein wenig umständlich vor, die Daten erst zu holen, dann neu zu berechnen und dann wieder weg zu schreiben. Manche Berechnungen macht man ja gleich mit der Datenbank.
Ich muß gerade eine Art Taskplaner schreiben, den ich schon wieder umwerfen mußte, da die Planung noch verfeinert werden muß und fand dann das Modul "schedaddle". Damit kann man ein neues Datum errechnen lassen, das ich dann wieder speichern muß.
deets

Also darauf zu kommen, dass dich das stoert, ist unmoeglich gewesen anhand des gegebene codes.

Wie dem auch sei: einmal lesen, einmal schreiben - so what? Die paar extra Bytes ueber die Leitung sind irrelevant, und wenn du dadurch ein Stueck code (das eigentliche update-statement) mehrfach verwenden kannst, undes somit getestet ist - dann ist das sogar besser so.

Doch wenn's dich stoert, dann hol doch nur die Dinge, die du brauchst, und update nur die, die ein update benoetigen. Wenn's scheee macht...
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Naja, bin ja froh, das es so halb wegs dann OK aussieht. Normalerweise bekomme ich immer nen Rüffel im Forum, wie ich irgendwelche Sachen programmiere ;)
Antworten