带有分页的Python fetchall()

时间:2017-01-18 10:15:51

标签: python

有人可以帮助我使用以下代码吗?我有超过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('---------------------------------------------------------------------------------------')

2 个答案:

答案 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