我正在慢慢失去理智。我一辈子都无法弄清楚为什么当我使用input()中的字符串时无法使此更新语句正常工作。第一部分工作正常:
table_name = 'ARCHIVE_BOXES'
column_name = 'status'
id_column = 'id'
c.execute("UPDATE {tn} SET {cn}=('reading') WHERE {idf}=(566)".
format(tn=table_name, cn=column_name, idf=id_column))
conn.commit()
但这不是,我已经两天撞墙了。
table_name = 'ARCHIVE_BOXES'
column_name = 'status'
id_column = 'id'
pk = ''
while not pk:
pk = input()
pk = ("(" + pk + ")")
primary_key = pk
ns = ''
while not ns:
ns = input()
new_status = ("\'" + ns + "\'")
new_status = ("(" + new_status + ")")
print("new_status: " + new_status)
c.execute("""
UPDATE
{tn}
SET
{cn} = ?
WHERE
{idf} = ?""".
format(tn=table_name, cn=column_name, idf=id_column),
(new_status, primary_key))
conn.commit()
我也尝试过用相同的结果来执行更新语句:
c.execute("UPDATE {tn} SET {cn}={ns} WHERE {idf}={idn}".
format(tn=table_name, cn=column_name2, idf=id_column,
ns=new_status, idn=primary_key))
就像this question一样,它不会引发错误-只是完全忽略它。
答案 0 :(得分:1)
您的主键可能是整数,但是在主代码(而不是代码段)中,您正在向其传递带括号的字符串作为字符串的一部分。因此,在主代码中,查询将包含WHERE id_column='(566)'
,并且根本不匹配任何记录。
尝试:
while not pk:
pk = input()
primary_key = int(pk)
看看效果是否更好。
SQL查询中的?
占位符会自动将引号括在字符串中,但不会在数字前后加上引号,因此您需要确保传递的参数具有正确的类型。
答案 1 :(得分:0)
为什么将新状态和主键值都放在撇号和括号之间?
只需要获取输入并将它们收集到一个在execute语句中定义的元组中即可。
如果 conn 是您的连接对象,则也可以直接使用其 execute 方法,而无需定义光标对象。
您还可以使用上下文管理器仅在未引发异常的情况下提交更改(请参见非常有趣的文档sqlite3 python module)。您无需显式声明commit语句。
primary_key = ''
while not primary_key:
primary_key = input()
# or primary_key = int(input())
new_status= ''
while not new_status:
new_status = input()
conn = sqlite3.connect("your_database")
with conn:
conn.execute("UPDATE {tn} SET {cn}=? WHERE {idf}=?".format(tn=table_name, cn=column_name, idf=id_column), (new_status, primary_key))
这样做更好吗?