使用sqlite3

时间:2019-03-20 12:37:19

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

我看过许多与此问题类似的消息来源,但似乎找不到解决我问题的答案。

我正在使用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中用每个答案更新答案?

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

2 个答案:

答案 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子句进行了进一步的阅读。