Python MySQL Insert Funktion

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

ich habe versucht, mit folgendem Code Temperaturen in eine Datenbank einzufügen:
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os
import MySQLdb as mdb

def systemhdd():
        os.system("bash -c \"hddtemp /dev/sda\"")
def raidhdd1():
        os.system("bash -c \"hddtemp /dev/sdb\"")
def raidhdd2():
        os.system("bash -c \"hddtemp /dev/sdc\"")

con = mdb.connect('localhost', 'temps', 'temps', 'temps')

shdd = systemhdd()
rhdd1 = raidhdd1()
rhdd2 = raidhdd2()
cur = con.cursor()
sql = """INSERT INTO temperaturen(Temp) VALUES ('shdd')"""

try:
        cur.execute(sql)
        con.commit()
except:
        print("Fehler")
        con.rollback()

con.close()

Jedoch fügt er nur "shdd" ein.
Wie bekomme ich es hin, dass er die Funktion "shdd" aufruft, und die Ausgabe davon in die Datenbank einfügt?

LG,
ClocxHD
 
Das 'shdd' wird in deinem Fall auch nur als String behandelt und auch genau so in die DB eingefügt. Probier mal mit:
Code:
sql = "INSERT INTO temperaturen(Temp) VALUES (?)"
cur.execute(sql, shdd)
 
Zuletzt bearbeitet:
Wenn ich das mit python temp.py ausführe, bekomme ich nur folgende Ausgabe:
Code:
root@proxmox:~# python temp.py
/dev/sda: ST9250827AS: 30°C
/dev/sdb: ST3500630NS: 35°C
/dev/sdc: ST3500630NS: 36°C
Fehler
root@proxmox:~#
Heißt gleich, er geht ins except.
 
Den Fehler selber ausgeben wäre hilfreicher. Welchen Datentyp hat das Feld in der DB?
 
Wie kann ich denn den Fehler ausgeben?

Das Feld hat den Datentyp VARCHAR(255)
 
Bin kein Experte bei Python aber so sollte es klappen:
Code:
except mdb.Error, e:  
print "Error %s:" % e.args[0]
Aber vermutlich liegt das an varchar. Die DB kann das Zeichen ° nicht verarbeiten. Probier den Datentyp auf nvarchar umzustellen.
 
Folgendes zeigt er mir jetzt an:
Code:
root@proxmox:~# python temp.py
/dev/sda: ST9250827AS: 30°C
/dev/sdb: ST3500630NS: 35°C
/dev/sdc: ST3500630NS: 37°C
Error 1064:
root@proxmox:~#
 
Hallo,

es scheint wohl wirklich an der Syntax zu liegen. Lass doch einfach das ° mal weg und schaue, ob es dann ohne Fehler durchläuft.

Grüsse
 
Hi,

MySQL Fehler 1064 ist "Fehler in der Syntax". Lass dir einfach mal dein SQL Statement ausgeben, das abgesetzt werden soll. Dann kannst du in der Datenbank direkt testen was du ändern müsstest, falls du es nicht eh schon siehst.

VG,
Mad
 
Wenn ich das direkt Teste:
Code:
INSERT INTO temperaturen(Temp) VALUES ('36°C')

Funktioniert es.

Edit:
Wenn ich das Statement ausgeben will, bekomme ich das:
Code:
root@proxmox:~# python temp.py
/dev/sda: ST9250827AS: 30°C
/dev/sdb: ST3500630NS: 35°C
/dev/sdc: ST3500630NS: 36°C
Error 1064:
Traceback (most recent call last):
  File "temp.py", line 32, in <module>
    print cur.execute(sql, shdd)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 155, in execute
    charset = db.character_set_name()
_mysql_exceptions.InterfaceError: (0, '')
root@proxmox:~#
 
Zuletzt bearbeitet: (Statement)
Hi,

und das ist auch exakt, was eingefügt werden soll vom Programm? Also auch exakt das wird angezeigt, wenn du dir das Statement ausgeben lässt?

VG,
Mad
 
Also eingefügt werden soll das:
INSERT INTO temperaturen(Temp) VALUES ('36°C')
(Natürlich die aktuelle Temperatur.)

Wenn ich das Statement ausgeben will, kommt das:
Code:
Traceback (most recent call last):
  File "temp.py", line 32, in <module>
    print cur.execute(sql, shdd)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 155, in execute
    charset = db.character_set_name()
 
Hi,

Wenn ich das Statement ausgeben will, kommt das:

Mach doch bitte einfach mal "print (sql)" (oder wie auch immer es bei Python aussieht, wenn man Strings ausgeben will) und guck mal was rauskommt. Klar kannst du die execute-Methode, die eine Exception wirft, nicht ausgeben.

VG,
mad
 
Dann kommt das:
INSERT INTO temperaturen(Temp) VALUES (%s)
 
Hi,

und das "(%s)" kommt dir nicht merkwürdig vor? ;)

Du gibst das schon unmittelbar vor dem "execute" aus, oder?

VG,
Mad
 
@Madman:
das %s ist lediglich ein Platzhalter für eine Variable, die beim execute übergeben wird. In diesem Fall shdd.
 
Wenn ich das danach ausgebe, gibt er mir nichts aus.
 
Hi,

@distrophik

Ah ok, deine Ergänzung bzgl. dem execute mit der Variable hab ich überlesen! Sorry!

Gibts eine Möglichkeit für den TE, da kein execute zu machen sondern das Statement nur auszugeben oder fertig zusammenzubauen? Ich kenne das so von PHP und Prepared Statements, bei Python keine Ahnung.

VG,
Mad
 
Probier sonst das Statement ohne Übergabeparameter zusammen zu stellen. Das ist zwar keine gute Lösung, aber kannst es mal ausprobieren:
Code:
    sql = "INSERT INTO temperaturen(Temp) VALUES ('" + shdd + "')"
    cur.execute(sql)
 
Dann bekomme ich folgende Meldung:
Code:
TypeError: cannot concatenate 'str' and 'NoneType' objects
 
Zurück
Oben