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:
:
# 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!
Çalışmaları mükemmel. Çok teşekkür ederim! – mbiokyle