Python Sqlite 更新多个值

7
有没有一种方法可以通过一条指令完成这两个更新操作?
cur.execute("UPDATE table_name1 SET email = 'foo@bar.com' WHERE id = 4")
cur.execute("UPDATE table_name1 SET phone = '0400-123-456' WHERE id = 4")

我尝试过各种变化,但无法使其工作。

编辑:我想将电子邮件、电话和ID作为参数传递。


1
你有查看过sqlite3文档吗? - Peter Wood
1
是的,彼得。我看了一下,但它对于使用Python实现同时更新多个值并没有帮助。 - Axle Max
5个回答

9
您的解决方案容易受到SQL注入攻击。如果您阅读文档的第一部分,它明确指出不要按照您提出的方式进行操作:

绝不要这样做 -- 不安全!

symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

请改用这种方法

t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)

因此,您应该将代码更改为以下内容:

conn = sqlite3.connect('connex.db')
cur = conn.cursor()
mobileval = '0400-123-456'
emailval = 'foo@bar.com'
constrain = 4

q = "UPDATE licontacts310317 SET (?, ?) 
             WHERE (?)=(?)"

cur.execute(q, (liemailval, limobileval, id, constrain) )

conn.commit()
conn.close()

我没有测试过,但希望你能理解 =)


6
以下内容可以正常运行:目前只是标准的SQL语句。
cur.execute("""UPDATE table_name1
            SET email = 'foo@bar.com', phone = '0400-123-456'
            WHERE id = 4""")

对我来说,出现了语法错误。我必须在表名和SET之间删除引号。cur.execute("UPDATE table_name1 SET email = 'foo@bar.com', phone = '0400-123-456' WHERE id = 4") - Axle Max

3

我曾遇到类似的问题,通过以下方法解决:

cur.execute("UPDATE licontacts310317 SET liemail=?, limobile=? WHERE id=? ", (liemailval, limobileval, constrain))

已经有其他人评论了,但最好使用 ? 占位符而不是字符串格式化操作,因为这些操作会使您的数据库容易受到 SQL 注入攻击(基本上是黑客攻击)。


谢谢你的回答。然而请注意,这是对一个相当旧的问题的新回答,没有提供其他回答没有涵盖的内容。如果您要介绍其他回答没有充分解决的问题,请考虑添加回答。 - Paritosh Singh
我遇到了相同的问题,而已发布的解决方案对我没用(要么根本不起作用,要么由于潜在的黑客问题而被建议不采用),所以我想分享对我有用的方法。 - sjb

2

好的,我做了一个可以使用参数的解决方案。

首先感谢David提供的原始答案。它有一个小语法错误(在该答案的评论中得到了纠正),但足以帮助我找出如何在不使用参数的情况下使其工作。

(注意:我认为David在我编辑问题添加需要使用参数之前就发布了他的回复。)

然后这个答案帮助我将解决方案参数化。

这是我的问题的解决方案。我将它张贴在这里,以防其他人有同样的问题,因为在发布原始问题之前,我进行了相当多的搜索,但找不到答案。

conn = sqlite3.connect('connex.db')
cur = conn.cursor()
mobileval = '0400-123-456'
emailval = 'foo@bar.com'
constrain = 4

cur.execute("UPDATE licontacts310317 SET liemail=%s, limobile=%s 
             WHERE %s=?" % (liemailval, limobileval, id), (constrain,))

conn.commit()
conn.close()

0

使用字典!

它们似乎很有效:

cur.execute(
   """UPDATE table_name1 
      SET email =:email, 
      phone =:phone 
      WHERE id = 4
   """, 
   {"email": "foo@bar.com", "phone": '0400-123-456'}
)

因此,只要提供它们包含的键,您就可以像这样发布一个字典:

cur.execute(
   """UPDATE table_name1 
      SET email =:email, 
      phone =:phone 
      WHERE id = 4
   """, 
   the_dictionary
)

the_dictionary = {"email": "foo@bar.com", "phone": "0400-123-456"}。你可以加入任意多的键值对。我觉得这样更易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接