gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:10:43 25 4
gpt4 key购买 nike

简单的问题可能有一个非常简单的答案。我正在将格式为“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');

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

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

关于python - 如何防止 sqlite 将字符串评估为数学表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com