MYSQL INSERT

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Lungentorpedo
User
Beiträge: 12
Registriert: Donnerstag 10. April 2014, 22:44

hi,

hab da leider beim insert immer eine fehler meldung

Code: Alles auswählen

sql"INSERT INTO temperature %r VALUE %r"% (tuple(sensorid), tuple(temperature),)
sensorid und temperature sind ein arrays

sensorid[0]=temp0
sensorid[1]=temp1

temperature[0]=25.12
temperature[1]=25.45

Wenn ich mir denh sql ausgeben lasse sieht das so aus:

INSERT INTO temperature ('temp0', 'temp1') VALUE (24.937, 25.062)

Ich glaube temp0 und temp1 durfen nicht in ' stehen, bin mir aber nicht sicher.
Wenn das ' weg muss wüste ich allerdings nicht wie.

danke schon mal im voraus
LUNGE
BlackJack

@Lungentorpedo: Ja es sind die '. Man sollte aber sowieso keine Werte in SQL-Anweisungen mit Zeichenkettenoperationen hinein formatieren. Stichwort SQL-Injection. Und ineffizient ist das zudem auch noch weil der Server dann jedes mal eine andere SQL-Anweisung sieht und die jedes mal neu parsen und in einen Ablaufplan umsetzen muss. Das die Spaltennamen dynamisch sind, sieht zudem nach einem komischen DB-Entwurf aus. Werden da in jede Zeile nur zwei Spalten mit Werten versorgt? Von wie vielen Spalten? Sensor-IDs sind ja eher Daten und keine Spaltenbezeicher.
Lungentorpedo
User
Beiträge: 12
Registriert: Donnerstag 10. April 2014, 22:44

hi, danke für die schnelle antwort

Mal ein wenig backup.

Ich hab da einen Raspberry Pi, der steuert mein Aquarium.
Und ich habe ein Python Script geschrieben, das temperatur 1-wire Sensoren automatisch erkennt und in die Abhängigkeiten in der Datenbank anlegt.
Eine Datenbank Tabelle ist dabei zuständig für das datenloggen, das heißt jede Stunde wird der Aktuell gemessene Temperaturwert in die Datenbank geschrieben
das ganze ist dynamisch.
mein table
:

Code: Alles auswählen

CREATE TABLE IF NOT EXISTS `temperature` (
  `Id` int(10) NOT NULL AUTO_INCREMENT,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `temp0` float DEFAULT NULL,
  `temp1` float DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1178 ;
Wenn ich jetzt einen neuen Sensor anschließe wird der Tabelle eine spalte hinzugefügt.

Ich erzähl das ganze weil das für den sql befehl wichtig ist.

Ich brauche also einen sql Befehl der sich der Sensor Anzahl anpasst.

sql="INSERT INTO temperature %r VALUE %r"% (tuple(sensorid), tuple(temperature),)

print befehl
z.B.
INSERT INTO temperature ('temp0', 'temp1') VALUE (24.937, 25.062)
oder:
INSERT INTO temperature ('temp0', 'temp1', 'temp2') VALUE (24.937, 25.062, 26.089)

wie kriege ich die ' aus dem sql befehl.

mit freundlichen Grüßen

Lunge
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Lungentorpedo hat geschrieben:Wenn ich jetzt einen neuen Sensor anschließe wird der Tabelle eine spalte hinzugefügt.
Falscher Datenbankentwurf. Wenn Sensoren dynamisch sind, dann solltest du sie auch so behandeln. Erstelle eine Tabelle von Sensoren, so dass diese eine Id bekommen. In einer weiteren Tabelle kannst du dann die Messungen ablegen, welche die Id des Sensors als Fremdschlüssel besitzen.

Natürlich gilt weiterhin das von BlackJack Gesagte. Bastel dir keine SQL-Ausdrücke selber mit %-Operator zusammen, die execute-Methode der Datenbankschnittstelle hat dafür extra einen zweiten Parameter. Dann kannst du dir auch nicht mir selbst in den Fuß schließen.
Das Leben ist wie ein Tennisball.
Antworten