如何在SQlite(sqlite3 python)中保存一个很长的字符串?

时间:2016-04-12 17:25:25

标签: python sqlite

我有一个长字符串,我想保存到SQlite数据库中(使用带有Python 3.5的sqlite3模块)。它工作正常,直到字符串大约500,000个字符。如果它变得比失败更长:

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倍)。

1 个答案:

答案 0 :(得分: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; --