Mysql. INSERT INTO funktioniert nicht (Beginnerfrage)

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
kanuddel
User
Beiträge: 6
Registriert: Montag 31. August 2020, 22:57

Hallo zusammen,

ich bin ganz neu im Phyton Thema und wollte Daten in eine SQL Tabelle eintragen lassen. Allerdings trägt er nichts ein und wirft auch keine Fehler. Daher wollte ich euch mal fragen, wo hier mein Fehler im Code ist. Code wurde auf das nötigste gekürzt und vereinfacht.

Code: Alles auswählen

try:
	con = mysql.connector.connect(user='...', password='...', host='...', database='...')
	cursor = con.cursor()
	try:
		cursor.execute("""INSERT INTO temperaturen (temp1, temp2) VALUES (%s, %s)""", ('1', '2')) 
	
	except mysql.connector.Error as err:
		print(err)
		
	cursor.close()
except mysql.connector.Error as error:
	print("Daten konnten nicht eingetragen werden. Fehler: {}".format(error))
con.disconnect()
Wie gesagt, ich bekomme keine Fehler ausgegeben, es wird aber auch nichts in die DB eingetragen. Ich bin der Meinung ich habe das so gemacht, wie es in Tutorials auch gemacht wurde, aber scheinbar habe ich irgendwas falsch gemacht was ich aber auch nicht erkenne.

Danke für eure Hilfe!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir fehlt ein commit.
kanuddel
User
Beiträge: 6
Registriert: Montag 31. August 2020, 22:57

Ah, danke. Wieder was gelernt. :) Funktioniert jetzt
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

@kanuddel: Deine Connection solltest du mit dem with-Statement öffnen. Dann kannst du dir das Schließen am Ende sparen. Das würde in diesem Fall auch fehlschlagen, wenn aus irgend einem Grund der try-Block beendet wird, bevor con eine gültige Connection zugewiesen wurde. Zum Beispiel, wenn der Server nicht erreichbar ist. In deinem Fall würde es dann zu einer Ausnahme kommen, der Code springt möglicherweise in den except-Blick du würdest den Fehlertext "Daten konnten nicht [...]" ausgeben und anschließend, nach dem Ausnahmeblock, versuchen eine Connection zu schließen, die niemals etabliert wurde. Da kommt es dann zu einer Ausnahme, den con wurde niemals definiert.
Die Fehlermeldung ist auch übrigens falsch. Denn der try-Block umfasst gar nicht das _Eintragen_ der Daten in die Datenbank sondern das Aufbauen der Verbindung zur Datenbank. Das Eintragen hast du extra gekapselt, aber:

Das "Behandeln" des Fehlers bei dem Einfügen des Datensatzes auf diese Weise würde ich mir nochmal sehr genau überlegen.
Exceptions sind dazu da, den aufgetretenen Fehler zu beheben und das Programm in einem stabilen Zustand weiterlaufen zu lassen. Du fängst hier aber alle Fehler, die vom mysql-Connector kommen können und gibst einfach nur eine Fehlermeldung aus. Da dein Programm aber eh nichts weiter tut als den Versuch zu unternehmen, etwas in die Datenbank zu schreiben, kannst du hier auch darauf verzichten. Dann eskaliert der Fehler, das Programm stürzt ab und du bekommst einen ausführlichen Stacktrace.
Es gilt: Entweder einen Fehler sinnvoll behandeln oder die Exception erst gar nicht fangen.

Eingerückt wird immer mit 4 Leerzeichen. Nicht mit mehr, weniger oder Tabs.

Die Einrückungstiefe deutet darauf hin, dass dein Code auf Modulebene steht.
Dort gehört kein Code hin. Auf Modulebene stehen nur Importe; die Definition von Klassen, Funktionen und Konstanten; der Einstieg zur Funktion main.

Warum sind deine Temperaturen Zeichenketten?

Das Ergebnis sieht dann ungetestet in etwa so aus:

Code: Alles auswählen

import mysql

DATABASE_CONFIG = {
    "user": "xxx",
    "password": "xxx",
    "host": "xxx",
    "database": "xxx"
}

def main():
    with mysql.connector.connect(**DATABASE_CONFIG) as con:
        try:
            cursor = con.cursor()
            query = "INSERT INTO temperaturen (temp1, temp2) VALUES (%s, %s)"
            cursor.execute(query, (1, 2))
            con.commit()
        except mysql.connector.Error as error:
            print(f"Oh no, something went wrong.\nIt was: {error}")
            print("I don't know what to do, so I raise the exception!")
            raise

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine nichtssagenden Namen, oder Abkürzungen. con ist connection, und temp1 oder temp2 sagen ja auch nichts darüber aus, welche temporären Daten Du da in Deiner Tabelle hast.
kanuddel
User
Beiträge: 6
Registriert: Montag 31. August 2020, 22:57

@sparrow
Ich habe dein Code Beispiel nun für mich hergenommen. Ich habe den SQL Zugriff zwar nicht in einem Funktion gepackt aber das sollte ja nichts ausmachen.
Allerdings bekomme ich einen Fehler. Kannst du mir diesen erklären?

Bild
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

@kanuddel: Code bitte immer als Text - ebenso wie die Fehlermeldung. Und beides in Code-Tags.

Tja, der Fehler bedeutet, dass sich der mysql-Connector leider doch nicht mit dem with-Statement benutzen lässt. Also musst du leider per Hand die Connection schließen. Sorry, ich dachte das wäre inzwischen bei Datenbankverbindungen State-or-the-art.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

In specifications, Murphy's Law supersedes Ohm's.
Antworten