Hilfe bei Datensätze aktualliesieren in eine MySQL DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
DGUV-V3
User
Beiträge: 24
Registriert: Dienstag 12. April 2016, 09:50

Hallo zusammen,

ich habe nach dem Tipp von Sirius folgenden Fehler:
[Codebox=python file=Unbenannt.py]
*** ERROR Unexpected data at end of OBJECT record
0: 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ~~~~????????????
16: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
32: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
48: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
64: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
96: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
112: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
128: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
144: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
160: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
176: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
192: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
208: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
224: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
240: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
256: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
272: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
288: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
304: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
320: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
336: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
352: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
368: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
384: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
400: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ????????????????
416: ff ff ff ff ????
Traceback (most recent call last):
File "DBschreiben.py", line 11, in <module>
daten = xlrd.open_workbook('/home/pi/EmailAnhang/Pruefergebnis.xls',formatting_info=True)
File "/usr/lib/python2.7/dist-packages/xlrd/__init__.py", line 435, in open_workbook
ragged_rows=ragged_rows,
File "/usr/lib/python2.7/dist-packages/xlrd/book.py", line 119, in open_workbook_xls
bk.get_sheets()
File "/usr/lib/python2.7/dist-packages/xlrd/book.py", line 705, in get_sheets
self.get_sheet(sheetno)
File "/usr/lib/python2.7/dist-packages/xlrd/book.py", line 696, in get_sheet
sh.read(self)
File "/usr/lib/python2.7/dist-packages/xlrd/sheet.py", line 1076, in read
saved_obj = self.handle_obj(data)
File "/usr/lib/python2.7/dist-packages/xlrd/sheet.py", line 1890, in handle_obj
raise XLRDError(msg)
xlrd.biffh.XLRDError: Unexpected data at end of OBJECT record
[/Codebox]

Mein Code sieht wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import xlrd
import datetime
import MySQLdb
_encoding = 'utf-8'

mysql = MySQLdb.connect(host='localhost', user='zy', passwd='xy', db='testdb')
cursor = mysql.cursor()
daten = xlrd.open_workbook('Pruefergebnis.xls',formatting_info=True)
query = """Insert Into orders (seriennummer, klassifikation, region, sc, betirebsart, hnr, liegenschaft, gebaeude, etage, raum, verantwortlicher, eib, letzepruefung, naechstepruefung) VALUES (%s, %$
sheet = daten.sheet_by_index(0)

for row in range (sheet.nrows):
        cursor.execute("UPDATE testdb set letztepruefung = :sheet.cell(row,8), 0), naechstepruefung = DATE_ADD(:sheet.cell(row,8), 0), Interval 2 Years) WHERE seriennummer =:sheet.cell(row,4), 0) a$



cursor.close()
mysql.comit()
mysql.close()
Danke im Voraus
Zuletzt geändert von Anonymous am Mittwoch 20. April 2016, 11:13, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@DGUV-V3: So sieht der Quelltext sicher nicht aus, denn das ist (mal wieder) syntaktisch kein Python. Da fällt schon der Compiler auf die Nase.

Die Ausnahme sieht danach aus als wenn das Tabellenkalkulationsdokument fehlerhaft ist.

Edit: Und Quelltext und Traceback passen ganz offensichtlich nicht zusammen, das ist also ganz ganz sicher nicht der Quelltext der zu der Ausnahme geführt hat.
DGUV-V3
User
Beiträge: 24
Registriert: Dienstag 12. April 2016, 09:50

@ BlackJack danke für den Hinweis mit der Defekten Datei, wie du dir bestimmt denken kannst (da laut dir das nicht mein python code ist) habe ich nun einen anderen Fehler und zwar ein Syntax Fehler nur egal wie ich an dem UPDATE Befehl rumbastele ich bekomme immer den selben Fehler
Ich habe auch schon mir die Finger wund gegooglet, dabei aber lediglich den Aufbau des UPDATE Befehls so wie ich ihn geschrieben habe gefunden.
Wäre dir sehr dankbar wenn du mir bei dem Syntax Fehler weiterhelfen würdest.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DGUV-V3: wie stellst Du Dir vor, dass wir irgendwelche Fehler finden können, wenn Du nur verkrüppelten Quelltext postest?? :twisted:
Wie ich schon an anderer Stelle geschrieben habe, kann man nicht einfach Pythoncode in ein SQL-Statement einflechten. Das tut einfach nicht. Du mußt Platzhalter verwenden.
DGUV-V3
User
Beiträge: 24
Registriert: Dienstag 12. April 2016, 09:50

Sirius3 hat geschrieben:@DGUV-V3: wie stellst Du Dir vor, dass wir irgendwelche Fehler finden können, wenn Du nur verkrüppelten Quelltext postest?? :twisted:
Wie ich schon an anderer Stelle geschrieben habe, kann man nicht einfach Pythoncode in ein SQL-Statement einflechten. Das tut einfach nicht. Du mußt Platzhalter verwenden.
Zum Verständnis:
Also muss ich die Zeile die ich aus meiner XLS-Datei haben will auslesen mit zum Beispiel: sheet.cell_value(1,1) und das dann in einen Platzhalter speichern?

Also so?:
XY= sheet.cell_value(1,2)

um dann in meinem UPDATE Befehl statt sheet.cell_value(1,2) XY benutzen damit es funktioniert?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DGUV-V3: wie Du aus der Dokumentation entnehmen kannst ist der Platzhalter für MySQLDB %s.
DGUV-V3
User
Beiträge: 24
Registriert: Dienstag 12. April 2016, 09:50

Sirius3 hat geschrieben:@DGUV-V3: wie Du aus der Dokumentation entnehmen kannst ist der Platzhalter für MySQLDB %s.
@Sirius könntest du mir dafür mal ein Beispiel zeigen und oder den Link zur Dokumentation geben, da ich das nun versucht habe einzubauen und immer noch den selben Fehler bekomme
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DGUV-V3: jetzt müßte ich wieder wissen, was Du genau gemacht hast und wie der Fehler incl. Traceback genau aussieht. Diesmal vielleicht der passende Code zum Fehler, der auch wirklich bei Dir gelaufen ist. Wie hast Du bisher programmiert, wenn Du nicht die Dokumentation zu den von Dir verwendeten Module kennst?
DGUV-V3
User
Beiträge: 24
Registriert: Dienstag 12. April 2016, 09:50

Sirius3 hat geschrieben:@DGUV-V3: jetzt müßte ich wieder wissen, was Du genau gemacht hast und wie der Fehler incl. Traceback genau aussieht. Diesmal vielleicht der passende Code zum Fehler, der auch wirklich bei Dir gelaufen ist. Wie hast Du bisher programmiert, wenn Du nicht die Dokumentation zu den von Dir verwendeten Module kennst?
Hier meine Fehlermeldung:
Traceback (most recent call last):
File "DBschreiben.py", line 16, in <module>
cursor.execute('UPDATE testdb set letztepruefung = :sheet.cell_value(row,8), %s), naechstepruefung = DATE_ADD(:sheet.cell_value(row,8), 0), Interval 2 Years) WHERE seriennummer =:sheet.cell_value(row,4), 0') and ':sheet.cell_value(row,9), 0) = OK) VALUES (%s,%s)'
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 ':sheet.cell_value(row,8), %s), naechstepruefung = DATE_ADD(:sheet.cell_value(row' at line 1")

und Hier der Code dazu:
[Codebox=python file=Unbenannt.py]

#!/usr/bin/env python
# -*- coding: utf8 -*-

import xlrd
import datetime
import MySQLdb
_encoding = 'utf-8'

mysql = MySQLdb.connect(host='localhost', user='root', passwd='xy', db='testdb')
cursor = mysql.cursor()
daten = xlrd.open_workbook('Test.xls',formatting_info=True)
query = """Insert Into orders (seriennummer, klassifikation, region, sc, betirebsart, hnr, liegenschaft, gebaeude, etage, raum, verantwortlicher, eib, letzepruefung, naechstepruefung) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,) """

sheet = daten.sheet_by_index(0)

for row in range (sheet.nrows):
cursor.execute('UPDATE testdb set letztepruefung = :sheet.cell_value(row,8), 0), naechstepruefung = DATE_ADD(:sheet.cell_value(row,8), 0), Interval 2 Years) WHERE seriennummer =:sheet.cell_vallue(row,4),0') and ':sheet.cell_value(row,9), 0) = OK) Values (%s,%s)'
cursor.close()
mysql.comit()
mysql.close()
[/Codebox]
BlackJack

@DGUV-V3: Das ist immer noch der gleiche Fehler wie vorhin. Lern Python und lern SQL. Sonst wird das nichts. Es sei denn jemand anders hier schreibt wieder ein weiteres Stück Code um der Lösung *Deines* Problems näher zu kommen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DGUV-V3: nochmal Schritt für Schritt.

Erst dachte ich, der Code kann ja gar nicht laufen, weil eine Klammer zu fehlt, aber mit Syntaxhighlighting kam ich dann drauf. Was bitteschön glaubst Du was das "and" in der Zeile

Code: Alles auswählen

cursor.execute('UPDATE testdb set letztepruefung = :sheet.cell_value(row,8), 0), naechstepruefung = DATE_ADD(:sheet.cell_value(row,8), 0), Interval 2 Years) WHERE seriennummer =:sheet.cell_vallue(row,4),0') and ':sheet.cell_value(row,9), 0) = OK) Values (%s,%s)'
macht?

Was glaubst Du sind in dieser SQL-Anweisung Platzhalter? Und was ist an dem Satz: "man kann nicht einfach Pythoncode in ein SQL-Statement einflechten. Du mußt Platzhalter verwenden." unverständlich? Und wie viele Klammern haben keinen Partner?
Antworten