Datenbank erstellen - Fehlermeldung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hey Leute,

    Ich habe ein kleines Problem,

    ich möchte dynamische Daten in meine Datenbank einlesen und speichern.
    Leider bekomme ich immer wieder eine Fehlermeldung und weiß nicht, wie ich sie beheben soll.

    Programmcode:

    #!/usr/bin/env python

    import sys
    import MySQLdb as mdb
    import time as Zeit
    import datetime
    import grovepi

    # Connect the Grove Sound Sensor to analog port A0
    # SIG,NC,VCC,GND
    sound_sensor = 0
    grovepi.pinMode(sound_sensor,"INPUT")


    connect = mdb.connect("localhost", 'root', 'raspberry', 'raspberrypidb');
    c = connect.cursor()


    c.execute("SELECT * FROM Lautstaerke")

    connect.commit()
    while True:
    try:
    # Read the sound level
    sensor_value = grovepi.analogRead(sound_sensor)

    c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES('CURRENT_DATE(), NOW(), 200, 200/10))")
    print "sensor_value =", sensor_value
    Zeit.sleep(.5)

    except IOError:
    print "Error"

    Fehlermeldung:

    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    Traceback (most recent call last):
    File "grove_sound_sensor.py", line 28, in <module>
    c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES('CURRENT_DATE(), NOW(), 200, 200/10))")
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
    _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''CURRENT_DATE(), NOW(), 200, 200/10))' at line 1")

    Kann mir da jemand helfen?

  • Hallo,

    bin mir nicht 100%ig sicher, da ich kein Python kann, aber mir kommt das hier komisch vor:

    c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES('CURRENT_DATE(), NOW(), 200, 200/10))")

    Der Anführungsstrich bei VALUES('CURRENT_DATE() ist eigentlich falsch, oder?

    [edit]Ach, unten steht ja, dass ein Fehler in der SQL-Syntax ist. Das wird das Anführungsstrichchen sein :)

    Einmal editiert, zuletzt von Tronn (8. Mai 2015 um 16:21)

  • Leider trotzdem noch der gleiche Fehler, aber danke, super gesehen =)

    #!/usr/bin/env python

    import sys
    import MySQLdb as mdb
    import time as Zeit
    import datetime
    import grovepi

    # Connect the Grove Sound Sensor to analog port A0
    # SIG,NC,VCC,GND
    sound_sensor = 0
    grovepi.pinMode(sound_sensor,"INPUT")


    while True:
    try:
    sensor_value = grovepi.analogRead(sound_sensor)
    Zeit.sleep(.5)


    connect = mdb.connect("localhost", 'root', 'raspberry', 'raspberrypidb');
    c = connect.cursor()

    c.execute(""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), '300', '300/10'))"")
    c.execute("SELECT * FROM Lautstaerke")

    connect.commit()




    except IOError:
    print "Error"

    print "sensor_value =", sensor_value

    Fehler:


    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    File "grove_sound_sensor.py", line 25
    c.execute(""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), '300', '300/10'))"")
    ^
    SyntaxError: invalid syntax

    Nun kommt das...

    Einmal editiert, zuletzt von hougy (8. Mai 2015 um 16:34)

  • Der selbe Fehler inkl.

    "[font="Courier"]_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''CURRENT_DATE(), NOW(), 200, 200/10))' at line 1")[/font]"

    ? "[font="Courier"]File "grove_sound_sensor.py", line 28, in <module>[/font]" ... Zeile 28 ist nämlich genau der SQL-Fehler. Schonmal versucht, dich direkt in die SQL-Konsole einzuloggen und das auszuprobieren? Hast du die richtige Datenbank ausgewählt? Gibt es die Tabelle? Ist "200/10" echt eine Anweisung, die in SQL erlaubt ist? Sind die Typen der Spalten korrekt (wahrscheinlich Integer für die letzten zwei)?

    [edit] Du hast deinen Beitrag editiert! :D

    Jetzt steht in deinem Code [font="Courier"]c.execute(""INSE..[/font]. Das geht natürlich nicht mit den doppelten Anführungszeichen hintereinander :D

    Einmal editiert, zuletzt von Tronn (8. Mai 2015 um 16:38)

  • #!/usr/bin/env python

    import sys
    import MySQLdb as mdb
    import time as Zeit
    import datetime
    import grovepi

    # Connect the Grove Sound Sensor to analog port A0
    # SIG,NC,VCC,GND
    sound_sensor = 0
    grovepi.pinMode(sound_sensor,"INPUT")


    while True:
    try:
    sensor_value = grovepi.analogRead(sound_sensor)
    Zeit.sleep(1)


    connect = mdb.connect("localhost", 'root', 'raspberry', 'raspberrypidb');
    c = connect.cursor()

    c.execute("""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), 300, 300/10)""")
    c.execute("SELECT * FROM Lautstaerke")

    connect.commit()




    except IOError:
    print "Error"

    print "sensor_value =", sensor_value

    Nun wurde endlich eine Datei in die Datenbank eingefügt...
    Auch mit Rechnung und so...
    Anschließend aber dann:

    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    sensor_value = 320
    Traceback (most recent call last):
    File "grove_sound_sensor.py", line 25, in <module>
    c.execute("""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), 300, 300/10)""")
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
    _mysql_exceptions.IntegrityError: (1062, "Duplicate entry '2015-05-08' for key 'PRIMARY'")

    Er soll aber jede Sekunde eine Datei schreiben..

    Primary Key entfernt..Problem vorerst gelöst =)))

    Einmal editiert, zuletzt von hougy (8. Mai 2015 um 16:42)

  • Code bitte in CODE posten! --> Bitte Config-Dateien immer in [code]-Tags packen

    Bitte Beitrag bearbeiten und korrigieren!


    Und als nächstes bitte genau posten wie die Datenbank bzw Tabelle angelegt wurde! Wenn da für die Spalten falsches eingestellt wurde kommen halt Fehlermeldungen ...

  • #!/usr/bin/env python

    import sys
    import MySQLdb as mdb
    import time as Zeit
    import datetime
    import grovepi

    # Connect the Grove Sound Sensor to analog port A0
    # SIG,NC,VCC,GND
    sound_sensor = 0
    grovepi.pinMode(sound_sensor,"INPUT")


    while True:
    try:
    sensor_value = grovepi.analogRead(sound_sensor)
    Zeit.sleep(2)


    connect = mdb.connect("localhost", 'root', 'raspberry', 'raspberrypidb');
    c = connect.cursor()

    c.execute("""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), 'sensor_value()', 400/10)""")
    c.execute("SELECT * FROM Lautstaerke")

    connect.commit()




    except IOError:
    print "Error"

    print "sensor_value =", sensor_value

    Nun versuchen wir anstatt der eingegebenen Zahl 400 , sensor_value eintragen zu lassen...
    Also wir nehmen einen Ton auf und der soll dann in die Datenbank gespeichert werden..
    Leider können wir 400 nicht einfach mit sensor_value ersetzen...
    Dann kommt folgendes Problem:

    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    grove_sound_sensor.py:25: Warning: Incorrect integer value: 'sensor_value()' for column 'Lautstaerke_DEZ' at row 1
    c.execute("""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), 'sensor_value()', 400/10)""")
    sensor_value = 360
    sensor_value = 97
    sensor_value = 98
    sensor_value = 97
    sensor_value = 97
    sensor_value = 97
    sensor_value = 97
    sensor_value = 129
    sensor_value = 97
    sensor_value = 99
    ^CTraceback (most recent call last):
    File "grove_sound_sensor.py", line 19, in <module>
    Zeit.sleep(2)
    KeyboardInterrupt

    Wenn wir bei den Einstellungen von "int" auf "varchar" umstellen, zeigt er uns sensor_value an...

    Nur wir wollen natürlich den Wert der sensor_value eingetragen haben...
    Man bräuchte also quasi einen Befehl darin, der sagt: "Nehme den INT Wert von sensor_value"
    Hat jemand eine Idee?

    Einmal editiert, zuletzt von hougy (8. Mai 2015 um 17:08)

  • Also ich kann mir nicht helfen, aber das ist doch falsch:

    c.execute("""INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), 'sensor_value()', 400/10)""")

    Du hast da sensor_value() als String eingefügt wegen der Anführungsstriche.

    Und mach das mal bitte mit der CODE-Formatierung richtig, wie Meigrafd schon gesagt hat. Das kann man überhaupt nicht lesen.

  • Hmkay, danke :)

    Also ich bin mir über die Python-Syntax nicht sicher, aber folgende Dinge fallen mir auf:
    - c.execute("Insert ...) hat immer noch drei Anführungsstriche am Anfang und am Ende. Änder das mal Bitte.
    - c.execute("Select") ergibt irgendwie keinen Sinn. Damit erhältst du den Inhalt der Datenbank zurück, und mit commit() schickst du das ausgelesene wieder zurück?
    - Vorhin war sensor_value noch eine Funktion ("sensor_value()"), jetzt nicht mehr, aber das sollte nicht das Problem sein, denke ich.

    Schreib doch bitte noch den SQL-Befehl, mit dem du die Tabelle erzeugt hast. Das wäre sicher hilfreich :)

  • So, habe die datenbank über phpmyadmin gemacht ..

  • Dann logg dich kurz in phpMyAdmin ein, wähle die Datenbank, dann Struktur, und dann sag uns, was steht unter:
    - Name
    - Typ

    Dann weiß ich nicht, ob es ohne den commit()-Befehl geht. Da müssen Python-Leute aushelfen :) Und was war jetzt nochmal die Fehlermeldung bzw. das Problem?

  • Code
    #	Spalte	Typ	Kollation	Attribute	Null	Standard	Extra	Aktion
    	1	Datum	date			Nein	0000-00-00		 Bearbeiten Bearbeiten	 Löschen Löschen	Mehr Weitere Aktionen anzeigen
    	2	Zeit	time			Ja	NULL		 Bearbeiten Bearbeiten	 Löschen Löschen	Mehr Weitere Aktionen anzeigen
    	3	Lautstaerke_DEZ	int(110)			Ja	NULL		 Bearbeiten Bearbeiten	 Löschen Löschen	Mehr Weitere Aktionen anzeigen
    	4	Lautstaerke_dB	int(11)			Ja	NULL		 Bearbeiten Bearbeiten	 Löschen Löschen	Mehr Weitere Aktionen anzeigen
    Code
    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    Traceback (most recent call last):
      File "grove_sound_sensor.py", line 25, in <module>
        c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), sensor_v     alue, 400/10)")
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
        self.errorhandler(self, exc, value)
      File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    _mysql_exceptions.OperationalError: (1054, "Unknown column 'sensor_value' in 'field list'")

    Das Problem ist, dass er "sensor_value" einfügen will, anstatt den INT Wert von sensor_value...
    Habe eben auf VARCHAR umgeschaltet, da ging es dann natürlich, da es nur Buchstaben sind..
    Die Frage ist jetzt, womit muss ich sensor_value ersetzen..

  • Wieso machst du Spalten 1 und 2 zu "date" und "time" ?
    Guckst dz hier: http://www.epochconverter.com/programming/my…om-unixtime.php
    Das gibt den Unixtimestamp aus den man ziemlich flexibel ins gewünschte Format umwandeln kann - ein allgemeiner Standard der die vergangenen Sekunden seit 01.01.1970 beziffert. Also: Beide Spalten löschen und nur noch eine mit INT(11) für den Timstamp erstellen -> Problem behoben.

  • Nein, das löst sein Problem nicht. Das Problem liegt wo anders:

    Das hier ist das SQL-Statement:
    "INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), sensor_value, 400/10)"

    Dabei sind INSERT, INTO, VALUES, CURRENT_DATE und NOW Funktionen bzw. Konstanten von SQL. Genauso eigentlich auch 400/10. Allerdings ist "sensor_value" nur ein String/Wort, und nicht der Wert aus Python. Man müsste das Statement eher so gestalten:
    var statement = "INSERT INTO Lautstaerke (...) VALUES (CURRENT_DATE(), NOW(), "
    statement = statement + sensor_value.ToString()
    statement = statement + ", 400/10)"
    c.execute(statement)

    Du musst irgendwie sensor_value in einen String umwandeln und in das SQL-Statement einfügen. Easy-peasy, eigentlich ;)


  • Beide Spalten löschen und nur noch eine mit INT(11) für den Timstamp erstellen -> Problem behoben.

    Ich bin auch Fan von Timestamp werten :).


    Hast du dich mit Datenbanken beschäftigt? Wenn du mehrere Werte abspeicherst wäre eine eindeutige ID mit Datentyp INT und AUTO_INCREMENT sinnvoll.

    Zu deinem Insert String

    Code
    "INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), sensor_value, 400/10)"

    Du kannst das in Python so lösen:

    Code
    daten = sensor_value()
    insert = "INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), '%s', 400/10)" % (daten)


    Ohne Gewähr

    Einmal editiert, zuletzt von Carbon2k (8. Mai 2015 um 19:39)

  • Hey, hab jetzt beides versucht. Leider immer noch ohne Erfolg. Es erscheint weiterhin folgende Fehlermeldung:

    sudo python grove_sound_sensor.py
    Traceback (most recent call last):
    File "grove_sound_sensor.py", line 25, in <module>
    c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), grovepi.analogRead(sound_sensor), 400/10)")
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
    _mysql_exceptions.OperationalError: (1305, 'FUNCTION grovepi.analogRead does not exist')

    Hier nochmals der Code:

  • Hallo,

    ich verstehe nicht, warum du immer wieder den selben Fehler einbaust.

    Hier ist der Fehler:
    c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), grovepi.analogRead(sound_sensor), 400/10)")

    Mach es so, wie wir es vorher geschrieben haben. In meinem letzten Post hatte ich es doch geschrieben, und vorher auch erklärt.

  • Hey,

    ich habe genau das eingegeben..aber leider funktioniert es immer noch nicht..es kommt immer

    Code
    pi@raspberrypi ~/GrovePi/Software/Python $ sudo python grove_sound_sensor.py
    Traceback (most recent call last):
      File "grove_sound_sensor.py", line 25, in <module>
        c.execute("INSERT INTO Lautstaerke(Datum, Zeit, Lautstaerke_DEZ, Lautstaerke_dB) VALUES (CURRENT_DATE(), NOW(), grovepi.analogRead(sound_sensor), 400/10)")
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
        self.errorhandler(self, exc, value)
      File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    _mysql_exceptions.OperationalError: (1305, 'FUNCTION grovepi.analogRead does not exist')


    Warum sagt er immer , dass die Funktion "grovepi.analogRead" nicht existiert? -.-
    Hier ist mein Programmcode..

    Ich hab wirklich alles versucht.. =(

    Einmal editiert, zuletzt von hougy (12. Mai 2015 um 10:22)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!