我看过许多与此问题类似的消息来源,但似乎找不到解决我问题的答案。
我正在使用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中用每个答案更新答案?
我是堆栈溢出的新手,所以我可能错过了与此类似的问题,如果可以,请链接它。
答案 0 :(得分:0)
对于表中的至少一个字段,您应该具有唯一的ID。这样,在执行答案更新时,您可以添加WHERE子句,例如:
cursor.execute( "UPDATE set_questionsTbl SET answer=? WHERE unique_id=?", (answer,uniqueId))
那样,并非所有记录都会被更新。
答案 1 :(得分:0)
您缺少的一点是,您指示数据库使用循环的当前迭代中的答案更新所有记录。
您的示例:
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
您的数据库不了解您放入表中的数据的含义。对于数据库,您插入Question
的{{1}}列中的问题只是字符序列。仅当该值是方程式的结果时,才能使用set_questionsTbl
中的方程式来设置Question
中的值。
您需要告诉您的数据库哪个答案来设置哪个问题。 您需要提供查询条件,该记录必须满足记录才能进行更新操作。这就是WHERE clauses的目的。
按照您的示例,您将需要在问题及其各自的答案之间建立关联。下面是一种方法。
首先,创建一个元组列表。每个元组的第一个元素都包含一个答案,第二个元素包含对应的问题(这必须是您插入Answer
列中的确切值)。
Question
然后,您可以遍历该元组列表以在游标中执行UPDATE查询:
quiz_question_answers = [(2, '1 + 1 ='), (4, '2 + 2 ='), (6, '3 + 3 =')]
这将更新在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 = |
等于Question
。
如果您只想为6D类的测验编号1的问题设置答案,则必须在查询中添加更多限制性条件,例如:
1 + 1 =
使用此特定解决方案(以正确顺序使用具有查询参数的元组列表),您还可以使用executemany
来让游标为您遍历参数元组列表:
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]))
Here对专门用于SQLite的WHERE子句进行了进一步的阅读。