sqlite3 Datenbank Hilfe

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,
    ich hab mir, unter anderem mit Hilfe dieses Forums, ein Programm zusammengebastelt, welches 1-wire Temperaturen und einen DHT22 ausliest.
    Mein Problem liegt jetzt noch in der Übergabe an die Datenbank.
    Zum einen scheint die erste Try - Except Anweisung nicht zu funktionieren. Soll heissen, auch wenn die Datenbank schon besteht gibt mir das Programm nicht die except Meldung zurück.
    Andererseits bekomme ich beim Einfügen der Daten immer die except Meldung.
    Habe schon versucht, mich über diverse Quellen zum Ziel zu lesen, komme aber auf keinen grünen Zweig.
    Es wäre sehr nett, wenn ihr euch das mal anschauen könntet.

    Die Ausgabe sieht zur Zeit aus wie folgt:

    02.08.2014-22:24:16

    Sensor ID | Temperatur
    ----------------------------
    28-0000062cf26c | 26.125 *C
    28-0000062e4fb7 | 26.062 *C
    28-0000062e5477 | 25.937 *C
    Temp 26.9 *C, Hum 59.6 %

    Einfuegen von Daten nicht moeglich!

    temp1 = 26.1 *C
    temp2 = 26.1 *C
    temp3 = 25.9 *C
    temp4 = 26.9 *C
    humi = 59.6 %


    Danke euch schonmal im Voraus.

  • Deine Tabelle erwartet in der Spalte temp1 usw eine Zahl, du übergibst aber auch eine-nicht-Zahl: *C

    Also entweder tatsächlich nur die Zahl in die Datenbank eintragen, ohne *C - oder den Typ der Spalte auf TEXT ändern :)

  • Danke ersgtmal für die schnelle Antwort.

    Klang auch erstmal sehr plausibel, allerdings hab ich die Einheit doch extra raus genommen und erst im print Befehl, für die Testausgabe wieder angefügt.
    Vielleicht übersehe ich da ja noch irgendwas. :denker:

    Einmal editiert, zuletzt von feridan (3. August 2014 um 10:07)

  • > cursor.execute("INSERT INTO klima VALUES (%s,%f,%f,%f,%f,%f), %(zeit, temp1, temp2, temp3, temp4, humi)")
    Das muesste wohl eher so aussehen:

    cursor.execute("INSERT INTO klima VALUES (%s,%f,%f,%f,%f,%f)", %(zeit, temp1, temp2, temp3, temp4, humi))

    - - - - -

    Hmm, ich hatte noch nicht alles gesehen:

    cursor.execute("INSERT INTO klima VALUES ('%s',%f,%f,%f,%f,%f)", %(zeit, temp1, temp2, temp3, temp4, humi))

    Wenn's immer noch nicht klappt: diesen String mal auf die Konsole ausgeben und genau
    ansehen !

    Einmal editiert, zuletzt von Tell (3. August 2014 um 10:41)

  • So, hab noch ein bisschen recherchiert und eure Vorschläge einfließen lassen.
    Auf folgende Weise scheint die Übergabe jetzt zu funktionieren.

    Zum einen waren die Anführungszeichen falsch gesetzt, zum anderen gab es wohl ein kleines Durcheinander mit den sqlite Funktionen.

    Was noch nicht funktioniert ist das erste except, falls die Datenbank schon existiert.

    Kann ich mir auch die Datenbank anzeigen lassen? So [/code]dass ich quasi eine Tabelle angezeigt bekomme?


  • Kann ich mir auch die Datenbank anzeigen lassen? So [/code]dass ich quasi eine Tabelle angezeigt bekomme?

    Wie meinst du das mit dem Anzeigen? Im Terminal? Das geht, du könntest eine einfache select-Abfrage starten, z.B. sqlite aufrufen und dann:

    Code
    .mode column
    select * from klima;


    Näheres dazu auch auf der sqlite-Homepage.


    Was noch nicht funktioniert ist das erste except, falls die Datenbank schon existiert.

    Kann sein, dass ich falsch liege, aber der try-except-Block macht doch keinen Sinn, oder? Da das create-Statement mit der Bedingung "if not exists" aufgerufen wird, springt er doch nie in den except Block, es sei denn die Tabelle existiert nicht und er kann sie nicht anlegen.


  • Kann ich mir auch die Datenbank anzeigen lassen? So dass ich quasi eine Tabelle angezeigt bekomme?

    Es gibt ein Tool so ähnlich wie phpMyAdmin nur eben für SQLite: phpLiteAdmin

  • Das mit dem " if not exist " hatte ich mir so auch schon überlegt. Man sieht es halt so in diversen Beispielcodes, dann hab ich es halt erstmal so übernommen. :D

    Vielen Dank für die wirklich schnelle Hilfe :bravo2:

    Als nächstes wollte ich eine 8-fach Relaiskarte Zeit bzw. Temperaturabhängig schalten lassen,
    da werde ich mich dann bestimmt nochmal melden.

    :danke_ATDE:


  • Das mit dem " if not exist " hatte ich mir so auch schon überlegt. Man sieht es halt so in diversen Beispielcodes, dann hab ich es halt erstmal so übernommen.

    Der SQL-Befehl ist völlig richtig. Als Ergebnis wird ein Fehlercode gesetzt, der abgefragt werden kann und sollte. In deinem Programm wird der Befehl "Create Table if not exists .." von SQLite geprüft und einfach übersprungen, wenn die Tabelle bereits existiert. Der Fehlercode wird von dir weder abgefragt noch geprüft.

    Ein Codebeispiel aus AutoIt sieht so aus:

    Code
    ; Beispiel für Create Tabelle mit Abfrage des Fehlercodes
    	$sExec = _
    		"Create TABLE if not exists [mail] " & _
    	    " ([m_id] INTEGER  PRIMARY KEY NOT NULL" & _
    	    ", [m_art] 				CHAR[  2]  NULL" & _
    	    ", [m_bezeich]			CHAR[20]  NULL" & _
    	    ", [m_mailadr] 			CHAR[20]  NULL" & _
    	    " );"
    	$sRueck1 = _SQLite_Exec ( -1, $sExec)

    Der Rückgabecode wird von SQLite an die AutoIt-Variable $sRueck1 übergeben und kann anschließend abgefragt.werden. Das muss unter Python ähnlich gelöst sein.

    Einmal editiert, zuletzt von Ramses (3. August 2014 um 16:57)

  • Ok, hab es jetzt so ähnlich im code stehen, wie framp es oben beschrieben hatte.

    Code
    except Exception as e:
        print e

    Ob es so funktioniert sehe ich dann wohl erst, wenn mal ein Fehler auftritt.;)

    Die Steuerung ist jetzt so weit fertig - hoffe ich...
    Morgen werden dann mal die Sensoren angebracht und ein bisschen verdrahtet und dann geht´s an den Praxistest.
    Mal gucken, ob ich beim zeit- und temperaturabhängigen Schalten alles richtig gemacht hab, ist immerhin mein erstes Projekt.
    Ich bin schon froh, dass ich mir beim Basteln an den GPIOs nix zerschossen hab. :lol:

    Einmal editiert, zuletzt von feridan (4. August 2014 um 22:32)

Jetzt mitmachen!

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