有人可以帮助我使用以下代码吗?我有超过130条记录,使用fetchall()
给了我所有这些记录,使数据无法读取。相反,我希望一次获取10条记录(例如,使用 Enter 键)。
这是我的代码:
def getAllPerguntasDB(self):
query = "SELECT p.id_pergunta,t.tema,d.grau,p.pergunta,p.op1,p.op2,p.op3,p.op4,p.correto FROM perguntas AS p INNER JOIN temas AS t ON (p.id_tema = t.id_tema) INNER JOIN dificuldade AS d ON (p.id_grau = d.id_grau) ORDER BY t.tema, d.grau ASC;"
self.cur.execute(query)
self.result = self.cur.fetchall()
for row in self.result:
id_pergunta = row[0]
tema = row[1]
grau = row[2]
pergunta = row[3]
op1 = row[4]
op2 = row[5]
op3 = row[6]
op4 = row[7]
correto= row[8]
print('---------------------------------------------------------------------------------------')
print("id: ", id_pergunta)
print("Tema:",tema,"\tGrau:",grau)
print("Pergunta: ", pergunta)
print("Opção 1: ", op1, "\tOpção 2: ", op2, "\tOpção 3: ", op3, "\tOpção 4: ", op4)
print("Resposta Correta: ", correto)
print('---------------------------------------------------------------------------------------')
答案 0 :(得分:3)
最简单的方法可能是使用userId
计算结果,并使用模运算符enumerate
每10行显示一条input
行或类似行。
%
注意:如果完全是10个结果的倍数,则会显示额外的“点击输入”行。要解决此问题,您可以使用上述方法的这种略微变化:
for i, row in enumerate(self.result, start=1):
print row
if i % 10 == 0:
input("Hit enter to show more")
答案 1 :(得分:1)
之前我还没有在Python中使用过任何类型的数据库查询,但我只是把它当成一个以固定大小的块生成数据序列,等待中间用户输入的问题。块。
这里使用生成器的优点是,如果数据库结果(即self.cur.fetchall()
的输出)也被延迟生成,它可以允许程序更有效地运行;并非所有数据库结果都将被计算,除非用户特别请求它们(通过按 Enter 足够多次)。请注意,我无法保证这是因为我不知道fetchall
是如何工作的。
批处理逻辑源自tobias_k的解决方案here。避免打印最终的方法"按下输入"消息也是基于他对您的问题的解决方案here。
在下面的代码中,我使用0到29之间固定范围的值模拟数据库结果。但是,您应该能够调整其操作原理,以便与您从中提取的数据一起使用。数据库中。
from itertools import islice, chain
def get_data():
# query = "SELECT p.id_pergunta,t.tema,d.grau,p.pergunta,p.op1,p.op2,p.op3,p.op4,p.correto FROM perguntas AS p INNER JOIN temas AS t ON (p.id_tema = t.id_tema) INNER JOIN dificuldade AS d ON (p.id_grau = d.id_grau) ORDER BY t.tema, d.grau ASC;"
# self.cur.execute(query)
# self.result = self.cur.fetchall()
result = range(0, 30)
yield from result
def batch(iterable, batch_size):
iterator = iter(iterable)
for first in iterator:
yield chain([first], islice(iterator, batch_size - 1))
def print_results(batched_results):
for result in batched_results:
print(result)
if __name__ == '__main__':
for i, batched_results in enumerate(batch(get_data(), batch_size=10)):
if i > 0:
input('Press enter for more results')
print_results(batched_results)
<强>输出强>
0
1
2
3
4
5
6
7
8
9
Press enter for more results
10
11
12
13
14
15
16
17
18
19
Press enter for more results
20
21
22
23
24
25
26
27
28
29