如何防止sqlite将字符串作为数学表达式进行求值?

时间:2012-09-11 21:11:33

标签: python sqlite

简单的问题可能有一个非常简单的答案。我正在从Python脚本中将格式为“2012-06-10”的日期字符串写入TEXT列。

e.g。

cur.execute("CREATE TABLE tbl(date TEXT, ...)")

cur.execute('INSERT INTO tbl VALUES(%s)' % (str(date[i])), ...)

该脚本实际上是评估日期字符串,因此“2012-06-10”会以“1996”的形式写入表中。从阅读文档,我猜这与类型亲和力有关,但我无法想象如何覆盖甚至为什么要对字符串进行评估。

1 个答案:

答案 0 :(得分:9)

两种方式:

  • 使用参数化查询:cur.execute("INSERT INTO tbl VALUES (?), [str(date[i])])。这是最好的方法。这样做吧。第二种方法仅包括后人。
  • 引用该值(注意:这几乎肯定在几乎所有情况下都是错误的方式):cur.execute("INSERT INTO tbl VALUES ('%s')" %(str(date[i]), )。这种方法不是最理想的,因为除非你小心,否则你很容易受到SQL注入的攻击。<​​/ li>

要理解为什么会这样,想象一下您的代码发送给SQLite的查询:

 INSERT INTO tbl VALUES (2012-06-10);

SQL引擎正确评估的位置为:

 INSERT INTO tbl VALUES (1996);

引用该值将解决此问题:

 INSERT INTO tbl VALUES ('2012-06-10');

但是如果值中包含某些字符('或空字节之类的字符),则会导致问题。

但是,使用参数化查询时,这些值会与查询分开发送,因此不会被误解。