2017-01-18 12 views
0

誰かが次のコードを教えてくれますか?私は130以上のレコードを持っていて、fetchall()を使って私にすべてのデータを渡すと、データを読み込むことが不可能になります。代わりに、私は一度に(レコードのキーを使用して)一度に10レコードをフェッチすることを好むでしょう。ページ区切り付きのPython fetchall()

これは私のコードです:

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

'for'ループと' for'ループの 'input("任意のキーを押してください)を追加するだけでいいのですか? – Arnial

+0

関連:http://stackoverflow.com/q/24527006/1639625これをあなたの 'self.results'イテレータに適用します。 –

+0

私は入力( "任意のキーを押す")、私は130回入力する必要があります、これは私が探しているものではありません。私はpymyqlを使用する – gmc1972

答えて

3

出力は、最も簡単な方法は、おそらくenumerateを使用して結果をカウントし、モジュロ演算子%を使用して、inputラインまたは類似のすべての10行を表示することです。

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

注:正確結果の10の倍数を持っている場合、これは、追加が表示されますがライン「を入力してくださいヒット」を。

1

私が前にPythonでのデータベースクエリの任意の並べ替えを使用していないが、私は単純に固定サイズのデータ​​のシーケンスを生成する問題としてこれを処理していますチャンク、チャンクの間のユーザ入力を待っている。

ここジェネレータを使用することの利点は、それがデータベースの結果(すなわちself.cur.fetchall()の出力)レイジー同様に生成される場合、プログラムをより効率的に動作することを可能にし得ることです。ユーザーが特に要求しない限り(と入力して十分な時間を入力して)、すべてのデータベース結果が計算されるわけではありません。 fetchallの仕組みがわからないので、これは保証できません。

バッチ論理はtobias_kの解hereから得られます。最後の "Press 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) 

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 
+0

@tobias_k偶然ではない、私は帰属を追加します。私は編集する他の細目も持っています。 – Tagc

+0

また、彼は最後に1つの余分な "press enter"を印刷するので、私は最後にそれを使いませんでした。そして、 'while'と' nextの代わりに 'for'ループを使って' StopIteration'を防ぐことができます' –

+0

@tobias_k私は' StopIteration'エラーを解決しましたが、結果の*怠惰な世代*を維持したい場合、私はループのために頼るか、最後の "Press Enter"を防ぐことはできません。道を知っていなければ?あなたの答えに+1してください。それは簡潔です。 – Tagc

関連する問題