【问题标题】:python sqlite question - Insert methodpython sqlite问题 - 插入方法
【发布时间】:2010-10-22 11:04:26
【问题描述】:

在下面的代码中,row 是一个包含 200 个元素(数字)的元组,listOfVars 是一个包含 200 个字符串的元组,这些字符串是 testTable 中的变量名。 tupleForm 是一个元组列表,每个元组有 200 个元素。

以下代码不起作用。它返回一个语法错误:

for row in tupleForm:
    cmd = '''INSERT INTO testTable listOfVars values row'''
    cur.execute(cmd)     

但是,以下工作正常。有人可以解释为什么吗?我发现 sqlite 太不直观了。

for row in tupleForm:
    cmd = '''INSERT INTO testTable %s values %s'''%(listOfVars, row) 
    cur.execute(cmd)

感谢您的帮助。

【问题讨论】:

  • 您有一个包含 200 列的表?很可能有更好的数据库设计可供您使用。例如,尝试将您当前拥有的大部分列名放入自己的列中。
  • 这不是 SQLite 的错! SQLite 无法知道listOfVarsrow 是什么意思...
  • 尝试在你的cmd = ... 分配之后做一个print(cmd),你会看到2 的不同。这不是一个真正的sqlite 事情,它只是一个Python 字符串格式问题。完成您想做的事情的最佳方法是应用 Adam Bernier 的答案。

标签: python sqlite


【解决方案1】:
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
               (','.join(listOfVars)), ','.join('?'*len(listOfVars)))
cur.executemany(insert_query, tupleForm)

请不要对数据库查询使用正常的字符串插值。
我们很幸运有the DB-API,它详细解释了如何满足您的要求。

编辑:
这种方法比您的第二次尝试更好的几个原因:

  1. 通过使用内置的字符串转义工具,我们避免了 SQL 注入攻击,并且
  2. executemany 接受元组列表作为参数。

【讨论】:

  • 感谢您的回答。我还没有尝试过,因为我不完全理解它;虽然我可以猜到不同的命令在做什么。无论如何,感谢有机会学习新事物。为了理解,为什么这个解决方案比我的第二种方法更好,它有效。我想 SilentGhost 已经解释过了,但我不明白。在我有机会尝试之后,我会接受答案。谢谢!!
【解决方案2】:

第一次尝试使用字符串作为值,这是错误的。第二个将元组的字符串值替换到字符串中,这两种情况下都会产生(...)

但两种形式都不正确,因为第二种形式根本没有转义值。您应该做的是使用参数化查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多