Python fetchall() with pagination Python fetchall()分页

2024-06-30 07:38:06 发布

您现在位置: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('---------------------------------------------------------------------------------------')

Tags: selfidtopas记录rowprinttema
2条回答

最简单的方法可能是使用enumerate计算结果,并使用模运算符%每10行显示一条input行或类似的行。在

for i, row in enumerate(self.result, start=1):
    print row
    if i % 10 == 0:
        input("Hit enter to show more")

注意:如果你有10个结果的倍数,这将显示一个额外的“点击回车”行。要解决此问题,您可以使用上述方法的细微变化:

^{pr2}$

我以前没有在Python中使用过任何类型的数据库查询,但我将其简单地视为在固定大小的块中生成数据序列的问题,在块之间等待用户输入。在

在这里使用生成器的好处是,如果数据库结果(即self.cur.fetchall()的输出)也是延迟生成的,则它可能允许程序更有效地运行;除非用户特别请求(通过点击Enter足够多次),否则不会计算所有数据库结果。请注意,我不能保证这是因为我不知道fetchall是如何工作的。在

批处理逻辑来自tobias_k的解here。避免打印最后“按enter”消息的方法也是基于他对您的问题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)

输出

^{pr2}$

相关问题 更多 >