Вам не хватает того, что вы указываете своей базе данных обновить все записи с ответом в текущей итерации цикла.
Ваш пример:
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
вашего set_questionsTbl
, являются просто последовательностями символов. У него нет средств для вычисления уравнения в Question
, чтобы установить значение в Answer
, только если это значение является результатом уравнения.
Вы должны указать своей БД, какой ответ задать для какого вопроса (ов).
Вам необходимо указать критерии запроса, которым должна соответствовать запись, чтобы к ней применилась операция обновления. Вот для чего ГДЕ пункты .
Следуя вашему примеру, вы захотите создать корреляцию между вопросами и соответствующими ответами. Ниже приведен один способ сделать это.
Сначала создайте список кортежей. Каждый кортеж содержит ответ в первом элементе, второй элемент содержит соответствующий вопрос (это должно быть точное значение, которое вы вставили в столбец 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 = |
- также будет обновлено, поскольку для этой записи также встречается единственный критерий, Question
, равный 1 + 1 =
.
Если вы хотите, чтобы ответы задавались только для вопросов викторины № 1 для класса 6D, вам нужно будет добавить более строгие критерии к вашему запросу, например ::
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)
Здесь приведено дальнейшее чтение предложений WHERE специально для SQLite.