variable per UPDATE einfügen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nobby46
User
Beiträge: 5
Registriert: Sonntag 23. Juli 2017, 20:14

@Irius3
danke für Deinen heißen Tipp. Ich hatte mir gerade schon Deinen Eintrag
cursor.execute("UPDATE tabname SET aktwert = ?, turn = ? WHERE spalte = ?", ('1', zeit, 17))
angesehen und auf meine Bedürfnisse angepasst.

Code: Alles auswählen

 cursor = conn.cursor()
 cursor.execute("UPDATE temperaturen SET fuehler = ? WHERE id = 1", (Aussenf, ))
 cursor.execute("UPDATE temperaturen SET fuehler = ? WHERE id = 2", (Innenf, ))
 conn.commit()
und alles funktioniert wie es. Hat mir sehr geholfen. Ich muss aber noch viel lernen was Datenbanken und SQL unter Python angeht. Vor vielen Jahren als ich noch Berufstätig war habe ich viel in Assembler und C programmiert, aber lang ist's her :)
Nochmal danke.

Norbert
Zuletzt geändert von Anonymous am Montag 24. Juli 2017, 13:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@nobby46: Welches PHP-Programm speichert denn Zeitangaben nicht als DATETIME oder TIMESTAMP, sondern als TEXT/CHAR/VARCHAR in so einem komischen Format? Datenbanken haben doch extra Datentypen für so etwas. Zum Beispiel um Messdaten in einem bestimmten Zeitraum abzufragen. Das funktioniert mit Zeiten als Zeichenketten entweder nicht richtig oder mindestens ineffizienter.

Tabellennamen würde ich in Einzahl benennen. Denn so ein CREATE beschreibt *einen* Datensatz, also woraus *eine* Temperatur besteht. Das ist äquivalent zu einer Klassendefinition, oder in C eine Struktur. Hier würde `temperaturen` für die Struktur ja auch irreführend sein:
[codebox=c file=Unbenannt.c]typedef struct {
int id;
char *name;
double wert;
} temperatur;[/code]

Ich habe da `wert` statt `fuehler` als Bezeichnung für die Temperatur genommen, denn ``temperatur.wert = 42.23;`` macht mehr Sinn als ``temperatur.fuehler = 42.23;``. Das ist bei SQL nicht anders.

Zur Namenschreibweise in Python gibt's den Style Guide for Python Code. Ausser Konstanten (ALLES_GROSS) und Klassen (MixedCase) schreibt man Namen klein_mit_unterstrichen. Also `aussenf` statt `Aussenf`. Wobei mir das `f` hier unklar ist (Fahrenheit? Bitte, bitte nicht `float`!), und `aussen` etwas zu unpräzise. `aussentemperatur` wäre passend wenn es die Aussentemperatur ist.

`connection` würde ich auch nicht abkürzen. Oder wenn dann vielleicht als `db` schreiben, denn das ist wenigstens eine gängige Abkürzung.

Und ich plädiere immer wieder gerne dafür SQLAlchemy als Abstraktionsschicht zu verwenden. Mindestens den Teil der vermeidet das man SQL von Hand schreiben muss, aber auch gerne das ORM.

Ohne ORM (ungetestet):

Code: Alles auswählen

    for id_, temperatur in [(1, aussentemperatur), (2, innentemperatur)]:
        connection.execute(
            temperature_table.update()
              .where(temperature_table.c.id=id_)
              .values(wert=temperatur)
        )
    connection.commit()
Mit ORM (ungetestet):

Code: Alles auswählen

    for id_, temperaturwert in [(1, aussentemperatur), (2, innentemperatur)]:
        (
            session.query(Temperatur)
              .filter_by(id=id_)
              .update({Temperatur.wert: temperaturwert})
        )
    session.commit()
Antworten