2017-08-18 3 views
1

他のデータベースの結果と比較するためにsqliteからクエリ結果を取得するためのヘルパ関数を作成したかったのですが、yieldとは対照的にTrue:pythonでの使用率

ユーザは、単純なインタフェースを持ち、クエリを使用して関数を呼び出し、他の準備をせずに結果を得ることを望んでいました。

私は2つの機能書いてしまった:

import sqlite3 
. 
. 
def sqlite_query_executor(query): 
    conn=sqlite3.connect(':memory:') 
    cur=conn.cursor() 

    yield cur.execute(query).fetchall()[0][0] 

し、ユーザによって呼び出されることを意図し1:最初の関数いじりながら

def query_sqlite(query): 

    return next(sqlite_query_executor(query)) 

を、私は最初に別のバージョンを書きました少し異なる終了:

def sqlite_query_executor(query): 
    conn=sqlite3.connect() 
    cur=conn.cursor() 

    while True: 
     yield cur.execute(query).fetchall()[0][0] 

両方のバージョンがうまくいくように見えましたが、メカニックたちと噛んでいる。

おそらく誰かがその違いを明らかにすることができますか?そのような用途の正しいパターンは何ですか?

+1

最初の関数は、反復ごとに接続されています。これは非常に劣っているようです。 –

+0

そのため、カーソルはずっと接続したままですか?接続を閉じる必要はありませんか? –

+0

なぜこのすべての「収穫」と「次のもの」を気にしましたか、そして、あなたが実際に*すべて*を望んでいないときは、「フェッチャル」ですか? – user2357112

答えて

0

はfetchAll()は、あまりにも多くの仕事をして、fetchone()に置き換えてください:

def sqlite_query_executor(query): 
    conn=sqlite3.connect() 
    cur=conn.cursor() 

    while True: 
     yield cur.execute(query).fetchone()[0] 
関連する問題