TypeError: 'float' object is not subscriptable

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
lacke_
User
Beiträge: 6
Registriert: Freitag 1. Dezember 2017, 16:09

Hallo Zusammen,

ich bin neu hier und in Python noch ziemlich unerfahren, deswegen möchte ich mich für eventuelle banale Fragen schon im Voraus entschuldigen.

Ich möchte aus einer Liste eine Datenbank erstellen und habe dazu folgendes Tutorial gefunden und auf mein Programm angewendet:
https://python-kurs.eu/sql_python.php

Der relevante Programmausschnitt sieht folgendermaßen aus:

Code: Alles auswählen

import sqlite3
connection = sqlite3.connect("Bienen_Daten.db")

cursor = connection.cursor()

#delete 
cursor.execute("""DROP TABLE Bienen;""")
#folgendes nur einmal(nicht in Schleife einbauen)
#namen kontrollieren
sql_command = """ 
CREATE TABLE Bienen ( 
Datum_Datenbank DATE PRIMARY KEY, 
temp_mean1 FLOAT, 
temp_mean2 FLOAT, 
tmax FLOAT, 
tmin FLOAT,
Bienen_Anzahl INTEGER,
gewicht FLOAT);"""

cursor.execute(sql_command)


        for p in liste_datenbank:
            format_str = """INSERT INTO Bienen (Datum_Datenbank, temp_mean1, temp_mean2, tmax, tmin, Bienen_Anzahl,gewicht)
            VALUES ("{datum_}", "{temp_mean1}", "{temp_mean2}", "{tmax_}","{tmin_}","{Bienen_Anzahl_}","{gewicht_}");"""

            sql_command = format_str.format(datum_= p[0], temp_mean1=p[1], temp_mean2=p[2], tmax_ = p[3], tmin_ = p[4], Bienen_Anzahl_ = p[5], gewicht_ = p[6])
            cursor.execute(sql_command)
    
        cursor.execute(sql_command)

        connection.commit()

        connection.close()
Der auftretende Fehler ist:
Traceback (most recent call last):
File "/home/pi/010+001mit waage.py", line 228, in <module>
sql_command = format_str.format(datum_= p[0], temp_mean1=p[1], temp_mean2=p[2], tmax_ = p[3], tmin_ = p[4], Bienen_Anzahl_ = p[5], gewicht_ = p[6])
TypeError: 'float' object is not subscriptable

Kann mir damit jemand weiterhelfen?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

... und willkommen im Forum :-)

Direkt zur Warnung vorab: python-kurs.eu ist an vielen Stellen stark suboptimal, weil es teilweise schlichtweg schlechtes oder falsches Python zeigt. So auch hier. SQL-Kommandos formatiert man _nicht_ mit String-Formatierung, weil das anfällig für SQL Injections ist. Die Python DB-API 2.0 (die du auch nutzt) kennt Wege zur sicheren Ersetzung von Platzhaltern. Ist auch in der offiziellen Doku beschrieben: https://docs.python.org/3.5/library/sqlite3.html.
Am besten vergisst du einfach, dass es diese Webseite python-kurs.eu gibt.

Das ist aber nicht dein Problem. Dein Fehlermeldung passt nicht zum gezeigten Code. Ersten hat der gar nicht so viele Zeilen, wie die Fehlermeldung besagt, zweitens würde der Code schon bei `for p in liste_datenbank` einen Fehler werfen, weil `liste_datenbanken` gar nicht existiert. Und selbst wenn es existieren würde, ist `p` scheinbar keine Liste, sondern ein Float-Wert - weswegen auch der Zugriff per Index nicht funktioniert.

Dass du `DROP TABLE...` am Anfang hast ist auch nicht wirklich gut. Wenn die Tabelle `Bienen` nicht existiert, dann bekommst du da schon einen Fehler. Besser ist `CREATE TABLE IF NOT EXISTS Bienen (....)` - dann werden aber Daten, die ggf. schon in der existierende Tabelle `Bienen` existieren nicht gelöscht. Wenn du (warum auch immer) die Tabelle immer löschen willst, dann funktioniert `DROP TABLE IF EXISIT Bienen` zumindest ohne Fehler, wenn die Tabelle nicht existiert.

Gruß, noisefloor
lacke_
User
Beiträge: 6
Registriert: Freitag 1. Dezember 2017, 16:09

Vielen Dank für Deine schnelle Antwort :D das hat mir sehr weitergeholfen und ich kann jetzt eine Datenbank erstellen.

Der Fehler hat schon zum Code gepasst, da ich nur einen kleinen Ausschnitt meines Codes gepostet habe.

Ich habe noch eine weitere Frage:
Ich versuche ein Überwachungssystem für einen Bienenstock zu programmieren und habe dazu eine while-Schleife programmiert, die mir in jedem Durchgang die Temperatur etc. misst und ausgibt.
Ist es nun möglich diese Daten nach jedem Durchgang in die Datenbank zu schreiben?
Bei mir tritt dann jedes mal folgender Fehler auf:
sqlite3.ProgrammingError: Cannot operate on a closed database.

Gibt es dafür eine Möglichkeit?

Viele Grüße

Lacke
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich geht das. Nur hast du die Verbindung zur Datenbank schon wieder geschlossen. Entweder öffnest du sie jedesmal wieder, oder schliesst sie erst gar nicht.
Antworten