Skip to main content
 首页 » 编程设计

python之如何防止 sqlite 将字符串评估为数学表达式

2025年05月04日21tuyile006

简单的问题可能有一个非常简单的答案。我正在将格式为“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”写入表中。通过阅读文档,我猜这与类型亲和性有关,但我不知道如何覆盖甚至为什么要评估字符串。

请您参考如下方法:

两种方式:

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

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

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

SQL 引擎正确评估为:

 INSERT INTO tbl VALUES (1996); 

引用该值将解决此问题:

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

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

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