2016-04-10 10 views
0

Ich weiß, dass dies mehrmals berührt wurde, aber ich kann nicht scheinen, dass das funktioniert. Ich schreibe ein Python-Programm, das eine sqlite3-Datenbank-Dump-Datei aufnimmt, analysiert und neu erstellt mit einem Datenbankmigrationstool (Yoyo-Migrationen)Python + sqlite3 - Blobdaten können nicht funktionieren

Ich stoße auf ein Problem mit Blobdaten in sqlite3 und wie zu richtig formatieren.

Hier ist eine grundlegende Erklärung meiner Programme ausführen - in Dump-Datei zu lesen, trennen in Anweisungen CREATE, INSERT-Anweisungen und andere - Migration Dateien erzeugen für SCHAFFT - eine Migrationsdatei für jede Tabellen fügt erzeugen - laufen die Migration, um die Datenbank neu aufzubauen (außer jetzt ist es aus Migrationen entstanden)

Grundsätzlich bekam ich eine Datenbank, die ich mit Migrationen kontrollieren muss. Dies ist nur der erste Schritt (immer die Sache neu aufgebaut, die Migration Tool)

Hier wird die Tabelle Erstellung der BLOB-Tabelle:

CREATE TABLE blob_table(
    blockid INTEGER PRIMARY KEY, 
    block blob 
) 

ich die Migrationsdatei dann erstellen:

# 
# file: migrations/0001.create_table.py 
# Migration to build tables (autogenerated by parse_dump.py) 
# 

from yoyo import step 
step('CREATE TABLE blob_table(blockid INTEGER PRIMARY KEY, block blob);') 

Beachten Sie, dass ich das nur in eine Datei schreibe, und am Ende die Migrationen ausführen. Als nächstes muss ich eine "Seed" -Migration korrigieren, die die Daten einfügt. Dies ist, wo ich in Schwierigkeiten gerate!

# here is an example insert line from the dump 
INSERT INTO blob_table VALUES(765,X'00063030F180800FE1C'); 

So ist die X ‚‘ Zeug ist die Blob-Daten, und ich brauche eine Python-Datei zu schreiben, die diese Daten wieder in die Tabelle einfügt. Ich habe eine große Menge von Daten, also verwende ich die Ausführung vieler Syntax. Hier ist, was die Samen Migrationsdatei aussieht (Beispiel):

# 
# file: migrations/0011.seed_blob_table.py 
# Insert seed data for blob table 
# 

from yoyo import step 
import sqlite3 

def do_step(conn): 
    rows = [ 
     (765,sqlite3.Binary('00063030303031340494100')), 
     (766,sqlite3.Binary('00063030303331341FC5150')), 
     (767,sqlite3.Binary('00063030303838381FC0210')) 
    ] 
    cursor = conn.cursor() 
    cursor.executemany('INSERT INTO blob_table VALUES (?,?)', rows) 

# run the insert 
step(do_step) 

ich versucht habe, mit sqlite3.Binary(), die Python eingebaute in buffer(), beide Kombinationen der beiden sowie int('string', base=16), hex() und viele andere. Egal, was ich mache, wird es nicht mit der Datenbank aus dem Dump übereinstimmen. Was ich meine ist:

Wenn ich die neue und alte Datenbank nebeneinander öffnen und excute diese Abfrage:

# in the new database, it comes out as a string 
SELECT * FROM blob_table WHERE blockid=765; 
> 765|00063030303031340494100 

# in the old database, it displays nothing 
SELECT * FROM blob_table WHERE blockid=765; 
> 765| 

# if I do this in the old one, I get the x'' from the dump 
SELECT blockid, quote(block) FROM blob_table WHERE blockid=765; 
765|X'00063030303031340494100' 

# if I use the quote() in the new database i get something different 
SELECT blockid, quote(block) FROM blob_table WHERE blockid=765; 
765|X'303030363330333033303330... (truncated, this is longer than the original and only has digits 0-9 

Mein Endziel ist es, die Datenbank neu zu erstellen und haben es in die Ausgangs identisch sein (aus dem die Müllkippe gemacht wurde). Irgendwelche Tipps, um das Blob-Zeug zur Arbeit zu bringen, sind sehr geschätzt!

Antwort

1

Die Klasse buffer kann binäre Daten verarbeiten. Es ist jedoch darauf bedacht, die Daten zu erhalten, die Sie ihm geben, und '00063030303031340494100' ist keine Binärdaten; es ist eine Zeichenfolge, die Ziffern Null enthält, null, null, sechs, usw.

Um einen String mit binären Daten zu konstruieren, verwendet decode:

import codecs 
blob = buffer(codecs.decode(b'00063030303031340494100', 'hex_codec')) 
+0

funktioniert perfekt. Ich danke dir sehr! – mbiokyle