1

我尝试编写的 firefox 插件需要一个大数据库。

有人建议我不要从“数据”目录加载数据库本身(使用 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 语句的长度限制为一百万字节,那么显然您将无法通过将数百万字节的字符串作为文字嵌入到 INSERT 语句中来插入它们。但无论如何你都不应该那样做。为您的数据使用主机参数。准备这样的简短 SQL 语句:

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

然后使用 sqlite3_bind_XXXX() 函数将大字符串值绑定到 SQL 语句。使用绑定避免了对字符串中的引号字符进行转义,降低了 SQL 注入攻击的风险。它的运行速度也更快,因为不需要对大字符串进行太多解析或复制。

可以使用 sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size) 接口在运行时降低 SQL 语句的最大长度。

于 2013-10-21T15:38:13.640 回答
0

您不能在单个 INSERT 语句中使用那么多记录;SQLite 将数量限制为其内部参数SQLITE_LIMIT_COMPOUND_SELECT,默认为 500。

只需使用多个 INSERT 语句。

于 2013-10-21T14:55:45.903 回答