【问题标题】:Update statement not working on sqlite3 using python更新语句不适用于使用 python 的 sqlite3
【发布时间】:2018-09-19 10:39:07
【问题描述】:

我正在慢慢失去理智。当我使用 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,它不会抛出错误——只是完全忽略它。

【问题讨论】:

  • 如果您尝试简单地打印"UPDATE {tn} SET {cn}={ns} WHERE {idf}={idn}".format(tn=table_name, cn=column_name2, idf=id_column, ns=new_status, idn=primary_key),它看起来应该吗?

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


【解决方案1】:

您的主键可能是一个整数,但在主代码(不是 sn-p)中,您将带括号的字符串作为字符串的一部分传递给它。因此,在主代码中,查询将包含 WHERE id_column='(566)' 并且根本不会匹配任何记录。

试试:

while not pk:
    pk = input()
    primary_key = int(pk)

看看效果是否更好。

SQL 查询中的? 占位符会自动在字符串周围加上引号,而不是数字周围,因此您需要确保传递的参数具有正确的类型。

【讨论】:

    【解决方案2】:

    为什么要将新状态和主键值都放在撇号和括号之间?

    只需获取输入并将它们收集到一个定义到执行语句中的元组中。

    如果 conn 是你的连接对象,你也可以直接使用它的 execute 方法,而无需定义游标对象。

    您也可以使用上下文管理器仅在没有引发异常的情况下提交您的更改(请参阅非常有趣的文档sqlite3 python module)。您不必显式声明提交语句。

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

    这样效果更好吗?

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2020-07-28
      • 1970-01-01
      • 2015-07-01
      • 2023-03-03
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      相关资源
      最近更新 更多