2016-04-10 15 views
0

Bunun birkaç kez dokunduğunu biliyorum, ancak bu çalışmayı göremiyorum. Bir sqlite3 veritabanı dökümü dosyasında alacak, analiz edip bir veritabanı geçiş aracını (yoyo geçişleri olarak adlandırılan) kullanarak yeniden oluşturabilen bir python programı yazıyorumpython + sqlite3 - Çalışmak için blob verileri alınamıyor

Ben sqlite3 blob verileriyle ilgili bir sorunla karşılaşıyorum ve nasıl doğru biçimlendirin. , Dökümü dosyasında okumak ayrı ifadeleri, INSERT deyimleri ve diğer CREATE içine - - yaratır için geçiş dosyalarını oluşturmak - İşte

benim programlarının temel bir açıklama yürütmek her tablolar için bir geçiş dosyası oluşturmak ekler - çalıştırmak veritabanını yeniden oluşturmak için geçiş (şu anda geçişler hariç):

Temel olarak bir veritabanı verildi ve geçişleri kullanarak denetimi ele geçirmem gerekiyor.

# 
# 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);') 
:

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

Sonra göç dosyası oluşturmak: Bu damla tablonun tablo oluşturma sadece ilk adım İşte

(taşıma aracını kullanarak şey yeniden inşa alma) olduğu

Sadece bir dosyaya yazdığımı ve sonra da geçişleri yürüteceğimi unutmayın. Daha sonra, verileri ekleyen bir "tohum" göçüne ihtiyacım var. Başım belaya girdiğim yer!

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

Yani X '' şeyler blob veridir ve geri tabloya bu verileri ekleyen bir piton dosyası yazmak gerekir. Çok miktarda veri var, bu yüzden birçok sözdizimini kullanıyorum. İşte tohum göç dosyası (bir örnek) gibi görünür: Ben sqlite3.Binary() kullanarak denedi

# 
# 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) 

, dahili buffer() piton, hem ikisinin kombinasyonları yanı sıra int('string', base=16), hex() ve diğerleri. Ne yaparsam yapayım, çöplükten veritabanına uymaz. Demek istediğim:

Yanında yeni ve eski veritabanı tarafını açmak ve bu sorguyu excute Eğer

:

# 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 

Benim nihai hedef veritabanını yeniden ve bir başlangıç ​​aynı olması sahip olmaktır (çöpün yapıldığı yer). Blob şeyleri işe almak için herhangi bir ipucu çok takdir edilmektedir!

cevap

1

buffer sınıfı, ikili verileri yönetme kapasitesine sahiptir. Ancak, verdiğiniz verileri korumaya özen gösterir ve '00063030303031340494100' ikili veri değildir; o basamak sıfır,

vs. sıfır, sıfır, altı, ikili veri içeren bir dize oluşturmak için içeren bir dizedir, decode kullanın:

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

Çalışmaları mükemmel. Çok teşekkür ederim! – mbiokyle

İlgili konular