【问题标题】:Inconsistent SQLite3 insert from Python 2.7来自 Python 2.7 的 SQLite3 插入不一致
【发布时间】:2025-11-23 05:40:02
【问题描述】:

我在从 Python 向 SQLite3 数据库中插入值时遇到问题。以下代码以不同的方式插入新行。

m.execute("INSERT INTO transactions VALUES "+str((timestamp,address,recipient_input,amount_input,signature_enc,public_key_readable,openfield_input))+"")

m.execute("INSERT INTO transactions VALUES ('" + str(timestamp) + "','" + str(address) + "','" + str(recipient_input) + "','" + str(amount_input) + "','" + str(signature_enc) + "','" + str(public_key_readable) + "','" +str(openfield_input) + "')")

第二个示例将新行正确插入 SQLite 数据库,第一个示例插入“\n”符号。对此有什么解释吗?我想使用第一个使用元组的模型,但不要用“\n”符号替换新行。

【问题讨论】:

    标签: python python-2.7 sqlite newline


    【解决方案1】:

    str() 根据 Python 语法规则格式化其参数,因此它永远不适用于 SQL。

    为防止格式化问题(和 SQL 注入攻击),请使用参数:

    m.execute("INSERT INTO transactions VALUES (?,?,?,?,?,?,?)",
              (timestamp, address, recipient_input, amount_input,
               signature_enc, public_key_readable, openfield_input))
    

    【讨论】:

      【解决方案2】:

      如果元组包含一个带有换行符的字符串,你只需要看看它是如何打印的,就可以看出区别:

      >>> print(("foo\nbar",))
      ('foo\nbar',)
      >>> print("foo\nbar")
      foo
      bar
      

      所以我们看到在一种情况下,字符串将被格式化为 '\n' 而在另一种情况下,它将有一个换行符。

      话虽如此,无论如何这不太可能是正确的方法。您已经向 SQL 注入敞开了大门。你最好过:

      values = (
          timestamp,
          address,
          recipient_input,
          amount_input,
          signature_enc,
          public_key_readable,
          openfield_input,
      )
      m.execute("INSERT INTO transactions VALUES (?,?,?,?,?,?,?)", values)
      

      【讨论】: