2016-04-12 19 views
-1

SQlite veritabanına kaydetmek istediğim uzun bir dizim var (Python 3.5 ile sqlite3 modülünü kullanarak). Dizi yaklaşık 500.000 karaktere ulaşana kadar iyi çalışıyor.SQlite (sqlite3 python) içinde çok uzun bir dize nasıl kaydedilir?

Traceback (most recent call last): 
[...] 
sqlite3.OperationalError: near "SomeWord": syntax error 

Benim kod: onunla başarısız olmadığı kadar uzun alırsa

cursor.execute("UPDATE data SET raw_str='{}' WHERE id=1".format(long_string)) 
connection.commit() 

Benim dize yaklaşık 6 Mil uzunluğunda bir ham veri dizisidir. Yine de, daha büyük verilerle çalışmayı bekliyorum (10 ila 100 kat daha büyük).

+0

"Ham veri" ile bunun ikili olduğu anlamına gelirse, "BLOB" 'a ihtiyacınız olduğu gibi geliyor. – jpmc26

+0

json'a yaptığım dizelerin bir listesi: long_string = json.dumps (["...", "...", ...]) –

+0

JSON'a "işlenmemiş veri" adını vermem. Biçimlendirilmiş veya yapılandırılmış veya bu gibi bir şey. – jpmc26

cevap

2

Hata iletinizi aşağıdaki gibi yeniden üretebilirim. long_string'un içinde tek tırnaklı bir karakterle sona erdiğini unutmayın.

import json, sqlite3 
db = sqlite3.connect('tmp.sqlite3') 
cursor = db.cursor() 
cursor.execute("create table data (raw_str STRING, id INT)") 
long_string = json.dumps(["' SomeWord"]) 
cursor.execute("Update data SET raw_str='{}' where id=1".format(long_string)) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near "SomeWord": syntax error 

cursor.execute("Update data SET raw_str=? where id=1", [long_string]) 
# works 

Bir SQL sorgusunun içine dize verileri yerine str.format kullanmamalısınız. Görülen şey, verilerinizin tek tırnaklı bir karakter içermesi ve yanlışlıkla bir SQL saldırısı saldırısı gerçekleştirmenizdir.

Dize, '; drop table data; -- içeremez.

+0

Verilerimle ilgili sorun buydu. Benim şimdiye kadarki en büyük örneğim, yaklaşık 150 Mil'lik birleşik uzunluğu olan yaklaşık 133.000 elemanın bir listesi haline geldi. Karakterler (bir txt dosyası olarak yaklaşık 150 MB). Veritabanımda tek bir collumdaki tüm verilerle yeni bir satır oluşturursam: "java.lang.OutOfMemoryError: Java yığın alanı" (SQL Access) veya "BrokenPipeError: [Errno 32] Broken pipe" (sqlite3 ve print) . –