2016-04-12 14 views
-1

私はSQliteデータベースに保存する長い文字列を持っています(sqlite3モジュールとPython 3.5を使用しています)。文字列が約500,000文字になるまでうまく動作します。SQlite(sqlite3 python)に非常に長い文字列を保存するには?

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

マイコード::それはで失敗するよりも、それが長くなる場合

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

私の文字列は、約6ミルの長さの生データ列です。それでも、私はより大きなデータ(10〜100倍)で作業することを期待しています。

+0

"生データ"とはバイナリを意味すると仮定すると、BLOBが必要です。 – jpmc26

+0

これは私がjsonに作った文字列のリストです:long_string = json.dumps(["..."、 "..."、...]) –

+0

私はJSONを "生データ"と呼んでいません。それは、フォーマットされているか構造化されているか、そのデータのようなものです。 – jpmc26

答えて

2

次のようにエラーメッセージを再現できます。 long_stringは、一重引用符で囲まれています。

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 

str.formatを使用して、文字列データをSQLクエリに置き換えないでください。あなたのデータには一重引用符が含まれているため、誤って自分自身でSQLインジェクション攻撃を行ってしまったようです。

あなたのためにラッキーな文字列には'; drop table data; --が含まれていませんでした。

+0

それは私のデータの問題でした。今までの私の最大の事例は、約133,000要素のリストで、約150MILの長さの組み合わせであることが判明しました。文字(txtファイルとして約150 MB)。私がデータベース内にすべてのデータを入れて新しい列を作成すると、「java.lang.OutOfMemoryError:Javaヒープ領域」(SQLアクセス)または「BrokenPipeError:[Errno 32] Broken pipe」(sqlite3およびprint) 。 –

関連する問題