Einsteigerfragen zum INSERT INTO

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

Hallo zusammen,

ich fange gerade an mich in Python einzuarbeiten und stehe mit einer Datenbank gerade auf Kriegsfuß.
Ich verstehe die Syntax hier noch nicht so wirklich. VB ist da eher was für mich, allerdigns gibt es diese Alternative nicht :K

Also hoffe ich einfach, dass mir hier jemand auf die Sprünge helfen kann.
Zu dem Problem:

Ich schreibe gerade ein Script, dass einen DHT am Raspberry ausließt und diese Werte in eine Datenbank schreiben soll.

Dazu der folgende Code:

Code: Alles auswählen

import Adafruit_DHT
import MySQLdb
import time

con = MySQLdb.connect (host = "localhost",
                              user = "****",
                              passwd = "*********",
                              db = "Terra")
 
sensor = Adafruit_DHT.DHT11
gpio = 4
 
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
print 'Temperatur: {0:0.1f}*C Luftfeuchtigkeit: {1:0.1f}%'.format(temperature,humidity)                #raus wenns klappt
Tempe = '{0:0.1f}'.format(temperature)
humi = '{0:0.1f}'.format(humidity)
SenID = 1
Zeit = time.strftime('%Y-%m-%d %H:%M:%S')
print Zeit           #raus wenns klappt
print Tempe           #raus wenns klappt
print humi           #raus wenns klappt

#Datenbank insert
cur=con.cursor()
cur.execute("INSERT INTO Auswertung (SensorID, Datum, Temperature, humidity) VALUES (%s, %s, %s, %s)",("1", Zeit, Tempe, humi,))
cur.close
con.commit
Wenn dies ausgeführt wird, sieht das ganze so aus:
pi@Terraformer:~/Terrascripts $ python sensor1.py
Temperatur: 24.0*C Luftfeuchtigkeit: 35.0%
2017-02-24 22:03:57
24.0
35.0
sensor1.py:26: Warning: Data truncated for column 'Datum' at row 1
cur.execute("INSERT INTO Auswertung (SensorID, Datum, Temperature, humidity) VALUES (%s, %s, %s, %s)",("1", Zeit, Tempe, humi,))
pi@Terraformer:~/Terrascripts $
Ich habe schon mit " und ' versucht einzelne Werte zu verändern. Dies brachte allerdings immer nur andere Fehler. Mal werden die Werte im String eingetragen, aber es wird ein Fehler erkannt im SQL oder aber es sieht so aus.
Nur zum besseren Verständnis: Die Sensor ID soll als fest als 1 gesetzt werden und stellt keine Variable dar.


Habt ihr hierfür eine Idee?


Gruß

Virtex
Zuletzt geändert von Anonymous am Samstag 25. Februar 2017, 00:07, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Virtex: Du solltest Daten mit den korrekten Datentypen und nicht nur Strings übergeben. Zahlen sind Zahlen und für das Datum gibt es datetime-Objekte oder gleich die SQL-Funktion ›NOW‹. Bei den letzten beiden Zeilen fehlen die Klammern.
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

@Sirius

Mit NOW hatte ich es anfangs auch versucht, aber das funktionierte nicht. Daher hab ich nach Lösungen gesucht und bin auf diese gestoßen. Da es funktioniert hab ich es einfach so übernommen. Wie kann ich denn in Python Datentypen ändern?

Dim Variable as Double
Variable = blablub

Oder wie funktioniert das? Wie gesagt, ich habe bislang immer nur VB gemacht und hab mit Python noch nie auch nur eine Zeile geschrieben bis auf diese. Daher muss ich hierbei ganz von Vorne anfangen. :(
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Virtex: Deine Objekte haben automatisch den Datentype, den sie eben haben. Du mußt einfach aufhören, alles in Strings umzuwandeln.

Code: Alles auswählen

import Adafruit_DHT
import MySQLdb

SENSOR = Adafruit_DHT.DHT11
GPIO = 4
 
humidity, temperature = Adafruit_DHT.read_retry(SENSOR, GPIO)
sensor_id = 1

connection = MySQLdb.connect(...)
cursor = connection.cursor()
cursor.execute("INSERT INTO Auswertung (SensorID, Datum, Temperature, humidity) VALUES (%s, NOW(), %s, %s)",(sensor_id, humidity, temperature,))
cursor.close()
connection.commit()
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

Mit deinem Code funktioniert es leider auch nicht. Das Datum muss scheinbar anders gemacht werden. Und ich musste die beiden Werte für Luftfeuchtigkeit und Temperatur tauschen :wink:
pi@Terraformer:~/Terrascripts $ python sensor1.py
Temperatur: 19.0*C Luftfeuchtigkeit: 31.0%
2017-02-25 16:05:16
19.0
31.0
sensor1.py:26: Warning: Data truncated for column 'Datum' at row 1
cur.execute("INSERT INTO Auswertung (SensorID, Datum, Temperature, humidity) VALUES (%s, NOW(), %s, %s)",(sensor_id, temperature, humidity,))
Kann ja eigentlich nicht so schwer sein so ein paar Variablen in nen SQL String zu bringen. Irgndwie ärgert mich meine Unfähigkeit :? :(
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Virtex: welchen Typ hat eigentlich Deine Datumsspalte?
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

@Sirius:

:shock: Au man, dass wars. Die Tabelle stand noch auf "Date" und konnte somit auch nichts mit der Uhrzeit anfangen. War gestern abend scheinbar schon zu spät um sowas anzufangen.

Vielen Dank für deine Hilfe. Jetzt funktionierts. :D
Antworten