更新语句不适用于使用Python的sqlite3

时间:2018-09-19 10:39:08

标签: python python-3.x sqlite sql-update

我正在慢慢失去理智。我一辈子都无法弄清楚为什么当我使用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一样,它不会引发错误-只是完全忽略它。

2 个答案:

答案 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))

这样做更好吗?