Обновление строки с несколькими различными значениями в python с помощью sqlite3 - PullRequest
0 голосов
/ 20 марта 2019

Я посмотрел много похожих источников на этот вопрос, но не могу найти ответ, который решает мою проблему.

Я использую 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

Я пытался исправить это много раз и искал много разных примеров, но не смог найти решение. Так как мне пройтись по каждому вопросу и обновить ответ с каждым ответом в викторине?

Я новичок в переполнении стека, поэтому, возможно, пропустил вопрос, похожий на этот, если так, пожалуйста, свяжите его.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вам не хватает того, что вы указываете своей базе данных обновить все записи с ответом в текущей итерации цикла.
Ваш пример:

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.

0 голосов
/ 20 марта 2019

У вас должен быть уникальный идентификатор хотя бы для одного из полей вашей таблицы. Таким образом, когда вы выполняете обновление ответа, вы можете добавить предложение WHERE, например:

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

и таким образом не все ваши записи будут обновлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...