1

私がコーディングしようとしている Firefox アドオンには、大きなデータベースが必要です。

「data」ディレクトリからデータベース自体をロードしないようにアドバイスされました(addon-sdkを使用して、Linuxボックスでローカルに開発しました)。

そこで、csv ファイルからコンテンツを取得し、作成したデータベースに挿入することにしました。

csv には約 80,000 行あり、渡そうとするとエラーが発生します。executeSimpleSQL()文字列としての非常に長いINSERTステートメント

('insert into table
  values (row1val1,row1val2,row1val3),
         (row2val1,row2val2,row2val3),
         ...
         (row80000val1,row80000val2,row80000val3)')

非同期に挿入する必要がありますか? 準備済みステートメントを使用しますか? データベースをsqliteファイルとして直接ロードする別のアプローチを検討する必要がありますか?

4

2 に答える 2

0

いくつかの sqlite 制限を超えている可能性があります。

sqlite実装制限から:

SQL ステートメントの最大長

SQL ステートメントのテキストの最大バイト数は SQLITE_MAX_SQL_LENGTH に制限されており、デフォルトは 1000000 です。この制限は、SQLITE_MAX_LENGTH と 1073741824 の小さい方と同じ大きさになるように再定義できます。

SQL ステートメントの長さが 100 万バイトに制限されている場合、INSERT ステートメント内にリテラルとして埋め込んで数百万バイトの文字列を挿入することは明らかにできません。しかし、とにかくそれを行うべきではありません。データにホスト パラメータを使用します。次のような短い SQL ステートメントを準備します。

INSERT INTO tab1 VALUES(?,?,?);

次に、sqlite3_bind_XXXX() 関数を使用して、大きな文字列値を SQL ステートメントにバインドします。バインディングを使用すると、文字列内の引用符をエスケープする必要がなくなり、SQL インジェクション攻撃のリスクが軽減されます。また、大きな文字列を解析したりコピーしたりする必要がないため、実行速度も速くなります。

SQL ステートメントの最大長は、実行時に sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size) インターフェイスを使用して減らすことができます。

于 2013-10-21T15:38:13.640 に答える
0

1 つの INSERT ステートメントでそれほど多くのレコードを使用することはできません。SQLite は、デフォルトで 500 である内部パラメータSQLITE_LIMIT_COMPOUND_SELECTに数を制限します。

複数の INSERT ステートメントを使用するだけです。

于 2013-10-21T14:55:45.903 に答える