INSERT mit Wert in Variablen funktioniert nich

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

Hallo,
bin neu hier und etwas am Verzweifeln :wink:
Habe eine DB angelegt, ich kann mich mit Python:
- mit der DB verbinden
- eine Tabelle anlegen
soweit so gut.
Wenn ich in das Feld "art" den Wert per Stringliteral "strom"
und "count" den Wert 1
eintrage, läuft der INSERT (8. Zeile von unten) durch, wenn ich anstatt der festen Werte meine 2 Variablen,
vart und vcount verwende, erhalte ich den Fehler
"MySQLdb._exceptions.OperationalError: (1054, "Unknown column 'vart' in"

Anbei mein Coding:

Code: Alles auswählen

#!/usr/bin/env python
import MySQLdb
import time

vart = "strom" # diese beiden Variablen sollen weiter unten im INSERT-Befehl verwendet werden.
vcount = 1


def current_date():
    akt_dat = time.strftime('%Y-%m-%d')
    return akt_dat

def now():
    jetzt = time.strftime('%H-%M-%S')
    return jetzt

print(current_date())
print(now())
print(vart)
print(vcount)

db = MySQLdb.connect("localhost", "peha", "xyz", "energie")
curs=db.cursor()

curs.execute ("DROP TABLE IF EXISTS verbrauch")

sql_command = ("""
CREATE TABLE verbrauch ( 
id INTEGER PRIMARY KEY AUTO_INCREMENT, 
datum DATE, 
uhrzeit TIME, 
art VARCHAR(10), 
count INTEGER);""")
               
curs.execute(sql_command)

try:
  [color=#FFFF40]  curs.execute ("""INSERT INTO verbrauch (datum, uhrzeit, art, count) VALUES (current_date(), now(), vart, vcount)""")[/color]
    db.commit()
    v_count = 0
    print("Done")
except:
    print("Error. Rolling back.")
    v_count = 0
    db.rollback()
Hat mir jemand eine Idee, wo mein Fehler liegt?

Danke schon mal :wink:
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst nicht einfach beliebige Variablen irgendwo aus deinem Programm einfügen, und die werden dann magisch ersetzt. Dazu musst du Platzhalter benutzen (hängen von dem DB connector ab, bei MySQL glaube ich ist es %s), und dann die Variablen als Tupel an execute übergeben.#

Entsprechend sind auch now und current_date sinnlos. Die musst nicht du definieren. Die kennt MySQL selbst.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Datum und Uhrzeit sind ein TIMESTAMP-Feld, am besten inklusive Zeitzone (ok das scheint MySQL nicht so richtig hinzubekommen).
So wie Du mit current_date und now die Zeiten bestimmst, sind die unabhängig voneinander, können also um gut 24 Stunden daneben liegen. Behandle Zeit und Datum immer zusammen!

Einfach so Variablen in Strings zu schreiben, bringt absolut gar nichts. Du mußt mit Platzhaltern arbeiten.

Benutze keine kryptischen Abkürzungen. Was soll den ein Vart sein? Meintest Du VAT oder vast oder was?
Man benutzt keine nackten Excepts.

Code: Alles auswählen

from contextlib import closing
import MySQLdb
import time


def build_database(db):
    with closing(db.cursor()) as cursor:
      cursor.execute("DROP TABLE IF EXISTS verbrauch")

      sql_command = ("""
    CREATE TABLE verbrauch ( 
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    datum TIMESTAMP,
    art VARCHAR(10), 
    count INTEGER);""")
                  
    cursor.execute(sql_command)


def main():
    db = MySQLdb.connect("localhost", "peha", "xyz", "energie")
    build_database(db)

    art = "strom" # diese beiden Variablen sollen weiter unten im INSERT-Befehl verwendet werden.
    count = 1
    with closing(db.cursor()) as cursor:
        cursor.execute("""INSERT INTO verbrauch (datum, art, count) VALUES (NOW(), %s, %s)""", [art, count])
    db.commit()

if __name__ == "__main__":
    main()
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

Hallo Sirius3,
vielen Dank für die schnelle und umfassende Antwort MIT Coding.
Echt toll :D
Werde mich Mal tiefer einlesen müssen.
Danke nochmal
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

Hallo Sirius3,

kannst Du mir zu MySQL mit der Mariadb unter Verwendung von Python ein Tutorial oder auch deutschsprachige Doku empfehlen?
Antworten