2017-12-20 14 views
1

私は2つのスコアscor1scor2が両方とも0でない場合は、すべてのテーブルから最低の行数を返す関数を構築したい:c.fetchone()は 'NoneType'を返しますか?

def mini(tablelist): 
mini = 1000 
for table in tablelist: 
    c.execute("SELECT numar_par FROM " + table + "") 
    c_min = len(c.fetchall()) 

    if c_min is None: 
     mini = 0 
    else: 
     c.execute("SELECT scor1 FROM " + table + " ORDER BY numar_par DESC LIMIT 1") 
     print("this is fetchone:",c.fetchone(),'from table: ',table) 
     scor1 = c.fetchone()[0] 
     c.execute("SELECT scor2 FROM " + table + " ORDER BY numar_par DESC LIMIT 1") 
     scor2 = c.fetchone()[0] 
     sum = int(scor1) + int(scor2) 
     if c_min < mini and sum >0: 
      mini = c_min 
return mini 

これは、print文の結果である:

this is fetchone: ('0',) from table: a 

これは誤りである:execute、Qとクエリーを実行した後

File "D:\pariuri\python\Pycharm test1\Test11 peste 0.5\functii.py", line 181, in mini 
scor1 = c.fetchone()[0] 
TypeError: 'NoneType' object is not subscriptable 
+0

テーブルには1つのエントリしかありませんか? –

+0

@cᴏʟᴅsᴘᴇᴇᴅのテーブル 'a'は現時点で –

答えて

2

ueryの結果はクエリの結果セットで利用できるようになり、その後c.fetch*のメソッドを使って反復処理を行うことができます。

ここで注意すべき事は、結果セットを超えるfetch*ます反復は、がそれをを排出することです。これはジェネレータに似ています。ジェネレータは一度しか反復処理ができません。

これは、このように動作します。照会する結果セット内の次の行を指すポインターを想像してみてください。 c.executeを実行すると、このように見て、結果セットを提供します - あなたがあなたのテーブルに行を1つだけ持っているので

head Result 1 (returned) 
    |____ Result 2 
     . 
     . 
     Result N 

-

head 
    |____ Result 1 
     Result 2 
     . 
     . 
     Result N 

c.fetchoneを呼び出した後、headは次の行、1行によって進歩を返します。 fetchoneの別の呼び出しが空のリストを返します。

+0

です。選択クエリでc.fetchone文を実行するたびに、1行進んでいきます。なぜprintステートメントは正しい戻り値を出力しますか? –

+0

@MihaiMoldovan Cuzは、あなたが 'fetchone'と呼んで初めてです。だから、シングルトン列を取り出し、それを印刷した。そして、次の行でそれをもう一度呼び出すと、Noneを返します。 –

+0

最初のc.fetchoneはprintステートメント内のものです。何かを学んでくれてありがとう。面白いのは、エラーをデバッグしようとするためにprintステートメントをそこに置くということです。だから、私は単にc.fetchoneを印刷して別の競合を作成します。どのようにしてもc_min = len(c.fetchall()) の場合、c_minがNoneの場合、エラーを追跡しました。fetchallがNoneの場合、 'len(fetchall())は0になるはずです。通過しません。とにかく私が掲示したコードから現れた問題に答えると私は本当の問題を得ます。 –

関連する問題