Python - Lesung BLOB-Typ von SQLite3 DB
Dies ist ein follow-on aus: Python - Konvertierung von Hex zu INT/CHAR
Ich habe jetzt eine funktionierende Lösung für das konvertieren der gespeicherten hex-Wert, der eine IP aus einer sqlite3 db in einem lesbaren und verwendbaren format. Aber bis jetzt habe ich getestet, durch kopieren und einfügen der Werte direkt aus einer sqlite3 db viewer.
Habe ich versucht, eine Umfrage der db mit einem script Suche, die Informationen habe ich jedoch entdeckt, dass es offenbar speichert blob-Daten in einem Puffer, was nicht sofort lesbar ist.
Beispielsweise die IP 192.168.0.1 ist als blob gespeichert geben Sie unter dem Feld "ip-X'C0A80001'
Da arbeitete ich mit einem kopierten und eingefügten Beispiel in meinem code, den ich konstruiert haben, die code-Streifen, die X' und ' von der hex in der Lage sein zu konvertieren. Was ich nicht bekommen kann ist, dass Werte von der Datenbank (X'C0A80001' <- dieser Wert, den ich mit einem db-manager).
Auf der Suche fand ich http://eli.thegreenplace.net/2009/05/29/storing-blobs-in-a-sqlite-db-with-pythonpysqlite/ die zeigte, ein Beispiel für das Lesen von blobs und aus einer sqlite-db, aber Ihre Methoden nicht funktionieren. Sie angezeigt der Fehler;
print row[0], str(row[1]).encode('hex') IndexError: tuple index out of range
Ich bin ziemlich neu in Python, also entschuldigt, wenn ich bin fehlt etwas grundlegendes, aber irgendwelche Hinweise oder code-Beispiele, die jemand hat, um mir helfen, meinen Kopf um diese würde geschätzt.
BEARBEITEN:
Doh, nicht fügen Sie den code aus dem obigen Beispiel;
c = conn.cursor()
c.execute('select ip from item where name = ' + "\'" + host + "\'")
for row in c:
print row[0], str(row[1]).encode('hex')
Kann es sein, mein Verständnis, das ist wirklich aus hier, warum kann ich es nicht Lesen den Weg zurück, ich will
UPDATE:
Anhand der folgenden Antwort, die ich meine modifizierten code;
rows = c.execute('select ip from item where name= ' + "\"" + host + "\"")
for row in rows:
print str(row[0]).encode("hex")
- Sie speichern IP-Adressen in der DB, aber nur IPv4 ersetzen. Was ist mit IPv6?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach überprüfung den link, es scheint, die wahrscheinlichste Erklärung ist eine leere Zeile. In Zeile 29 wird richten Sie eine for-Schleife zu gehen, über die Ergebnisse einer Abfrage. In python das heißt, Sie haben eine Liste:
[item,item2,item3]
und jedes mal, wenn Sie die Schleife Durchlaufen, Ihrerow
variable zeigt auf das nächste Element.Innerhalb der Schleife prüfen Sie den Inhalt des aktuellen Elements. Jedes dieser Elemente ist ein Tupel, das suppposedly hat mindestens zwei Einträge. Aber wenn diese Elemente nicht bereits ein Eintrag für
row[0]
oderrow[1]
Sie erhalten dann eine index out of range exception.Du noch nicht gepostet genug code, um die Bestimmung warum dies geschah machbar, aber der code läuft, würde ich vorschlagen, diese:
Fortgesetzt wird Sie in Ihrer gesamten query-Ergebnis, auch wenn einige von Ihnen schlecht sind.
Edit: ich sah gerade dein update und dein problem ist, dass c nicht halten Sie die Inhalte Ihrer Abfrage.
c.execute('select ip from item where name = ' + "\'" + host + "\'")
gibt eine Liste, die Sie ignorieren.Dem ursprünglichen Beispiel funktioniert, da bekommen Sie eine Liste, in der for-Schleife, und so ist es eine anonyme variable nur innerhalb der Schleife Kontext. Um fix-code:
c.execute('select ip from item where name = ' + "\'" + host + "\'")
ist schlechter Stil. Besser wärec.execute('select ip from item where name = ?', host)
wo ich weiß nicht, ob sqlite will ein?
oder eine%s
als MySQL will.