1

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

例如

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

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

该脚本实际上正在评估日期字符串,因此“2012-06-10”作为“1996”写入表中。通过阅读文档,我猜这与类型亲和力有关,但我不知道如何覆盖甚至为什么要评估字符串。

4

1 回答 1

9

两种方式:

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

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

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

SQL 引擎正确评估为:

 INSERT INTO tbl VALUES (1996);

引用该值将解决此问题:

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

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

但是,对于参数化查询,值是与查询分开发送的,因此它们不会被误解。

于 2012-09-11T21:14:14.373 回答