【问题标题】:Updating a row with multiple different values in python with sqlite3使用 sqlite3 在 python 中更新具有多个不同值的行
【发布时间】:2019-08-11 03:47:43
【问题描述】:

我查看了许多与此问题类似的来源,但似乎无法找到解决我问题的答案。

我使用 python3.7.1 和 sqlite3 来创建测验。我有一系列问题,我已使用以下代码示例插入到表格中,并带有“Class_name”和“quizNumber”:

quizQuestion = ['1 + 1 =', '2 + 2 =', '3 + 3 =',...]
quizNumber = (1)
quizClass = ('6D')

for question in quizQuestions:
    cursor.execute( "INSERT INTO set_questionsTbl (QuizNumber, Class_name, Question) VALUES (?,?,?)", (quizNumber,quizClass,question))

这段代码运行良好,表格(set_questionsTbl)如下所示:

QuizNumber | Class_name | Question | Answer 
-------------------------------------------
1          | 6D         | 1 + 1 =  | 
1          | 6D         | 2 + 2 =  |
1          | 6D         | 3 + 3 =  |

etc..

我也有很多答案:

quizAnswers = [2,4,6,...]

出现的问题是尝试使用答案更新表格时,它看起来像这样:

QuizNumber | Class_name | Question | Answer 
-------------------------------------------
1          | 6D         | 1 + 1 =  | 2
1          | 6D         | 2 + 2 =  | 4
1          | 6D         | 3 + 3 =  | 6
etc...

我试过的代码是这样的:

for answer in quizAnswers:
    cursor.execute("UPDATE set_questionsTbl SET Answer = (?) ", (answer,))

这并没有像每个循环一样工作,之前输入的答案被覆盖了,留下了这个:

QuizNumber | Class_name | Question | Answer 
-------------------------------------------
1          | 6D         | 1 + 1 =  | 6
1          | 6D         | 2 + 2 =  | 6
1          | 6D         | 3 + 3 =  | 6
etc...

我也尝试将循环连接在一起,但这不起作用,表格看起来像:

QuizNumber | Class_name | Question | Answer 
-------------------------------------------
1          | 6D         | 1 + 1 =  | 2
1          | 6D         | 2 + 2 =  | 2
1          | 6D         | 3 + 3 =  | 2
1          | 6D         | 1 + 1 =  | 4
1          | 6D         | 2 + 2 =  | 4
1          | 6D         | 3 + 3 =  | 4
1          | 6D         | 1 + 1 =  | 6
1          | 6D         | 2 + 2 =  | 6
1          | 6D         | 3 + 3 =  | 6

我已多次尝试更正此问题并搜索了许多不同的示例,但似乎无法找到解决方案。那么如何循环遍历每个问题并使用 quizAnswers 中的每个答案更新答案?

我是堆栈溢出的新手,所以我可能错过了类似的问题,如果是,请链接它。

【问题讨论】:

  • 请查看WHERE clauses。正如答案所暗示的那样,您不一定需要唯一的 ID,只要您可以提出一组标准,可以单独或共同识别您希望语句影响的记录。在您的情况下,QuizNumberClass_nameQuestion 的组合可以作为这样的集合。

标签: python python-3.x for-loop sqlite


【解决方案1】:

您的表中至少有一个字段应该有一个唯一的 ID。这样,当您执行答案更新时,您可以添加 WHERE 子句,例如:

    cursor.execute( "UPDATE set_questionsTbl SET answer=? WHERE unique_id=?", (answer,uniqueId))

这样不会更新您的所有记录。

【讨论】:

    【解决方案2】:

    您缺少的一点是,您指示数据库用当前循环迭代中的答案更新所有记录。
    您的示例:

    quizAnswers = [2,4,6]
    for answer in quizAnswers:
        cursor.execute("UPDATE set_questionsTbl SET Answer = (?) ", (answer,))
    

    基本上是这样:

    set Answer for *all* records to 2
    set Answer for *all* records to 4
    set Answer for *all* records to 6
    

    您的数据库不理解您放入表中的数据的含义。对于数据库,您插入到 set_questionsTblQuestion 列中的问题只是字符序列。它无法评估Question 中的等式,以便在Answer 中设置一个值,前提是该值是等式的结果。

    您需要告诉您的数据库为哪个问题设置哪个答案。 您需要提供查询条件,记录必须满足才能应用更新操作。这就是WHERE clauses 的用途。

    按照您的示例,您需要在问题及其各自的答案之间建立关联。以下是一种方法。

    首先,创建一个元组列表。每个元组在第一个元素中包含一个答案,第二个元素包含相应的问题(这需要是您插入到 Question 列中的确切值)。

    quiz_question_answers = [(2, '1 + 1 ='), (4, '2 + 2 ='), (6, '3 + 3 =')] 
    

    然后您可以遍历该元组列表以在光标中执行 UPDATE 查询:

    for q_a in quiz_question_answers:
        cursor.execute("UPDATE set_questionsTbl SET Answer = ? WHERE Question = ?", (q_a[0], q_a[1]))
    

    这将更新在Question 中具有特定方程式的所有 记录中的答案。具有不同 Class_name 和/或 QuizNumber 的记录 - 例如这样的记录:

    QuizNumber | Class_name | Question | Answer 
    -------------------------------------------
    4          | 5A         | 1 + 1 =  | 
    

    - 也将更新,因为该记录也满足唯一条件,即等于 1 + 1 =Question

    如果您希望仅针对 6D 类的第 1 题的问题设置答案,则必须在查询中添加更多限制条件,例如:

    quiz_question_answers = [(2, '1 + 1 =', 1, '6D'), (4, '2 + 2 =', 1, '6D'), (6, '3 + 3 =', 1, '6D')]
    for q_a in quiz_question_answers:
        cursor.execute("UPDATE set_questionsTbl "
                       "SET Answer = ? "
                       "WHERE Question = ? "
                       "AND QuizNumber = ? "
                       "AND Class_name = ?",
                       (q_a[0], q_a[1], q_a[2], q_a[3]))
    

    使用这个特殊的解决方案(使用元组列表和正确顺序的查询参数),您还可以使用executemany 让光标为您循环遍历参数元组列表:

    quiz_question_answers = [(2, '1 + 1 ='), (4, '2 + 2 ='), (6, '3 + 3 =')]
    cursor.executemany("UPDATE set_questionsTbl SET Answer = ? WHERE Question = ?", quiz_question_answers)
    

    Here 进一步阅读了专门针对 SQLite 的 WHERE 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 2014-10-29
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多