2016-12-31 275 views
0

如果我想用python在sqlite3中插入一个变量值,可以编写下面的语句。例如:如何在Python中使用UPDATE语句sqlite3插入变量?

import sqlite3 
import random 

conn = sqlite3.connect('testing.db') 
c = conn.cursor() 
c.execute("CREATE TABLE IF NOT EXISTS testing(Name TEXT, Telephone TEXT, ID REAL)") 

var1 = input("Value:") 
var2 = input("Value:") 
var3 = random.randint(1,20) 

c.execute("INSERT INTO testing VALUES(?, ?, ?)", (var1, var2, var3)) 

conn.commit() 
conn.close() 

如果我想要做同样与UPDATE语句。我尝试这样做,是给我的错误:

column = input("Column to update:") 
update_user = input("Value to update:") 
field_name = input("Where field name equal to:") 
value = input("Value") 

c.execute("UPDATE testing SET ? = ? WHERE ? = ?", (column, update_user, field_name, value)) 

conn.commit() 

这是我得到的错误:

sqlite3.OperationalError: near "?": syntax error 
+1

复制错误并将其发布到此处。 – Shubham

+0

可能重复的[sqlite3.OperationalError:near“?”:syntax error](http://stackoverflow.com/questions/25387537/sqlite3-operationalerror-near-syntax-error) – Shubham

回答

2

这其实是一个普遍的问题,在您的更新查询,您不能参数列名字。换句话说:

UPDATE testing SET ? = ? WHERE ? = ? 
       THIS^  THIS^ 

不能查询占位符,你必须将它们插入通常的方式 - 通过字符串格式化:

c.execute(""" 
    UPDATE 
     testing 
    SET 
     {0} = ? 
    WHERE 
     {1} = ?""".format(column, field_name), (update_user, value)) 

虽然,你应该小心妥善消毒,验证columnfield_name值以防止SQL injection attacks

+0

即使此问题已被回答不同的变化,我会留下这个答案,因为它指出了在这个特定的用例中发生了什么以及要做什么。 – alecxe