0

db(sqlite3)の行からデータを単純に実行しようとしているときに問題が発生しました。DB入力には4つのフィールドがあるため、入力すると保存されます。しかし、これが私の問題です。4つの行すべてを実行すると、フィールドの1つが入力されていないと、エラーが発生します。

これがデータベース実行コードです。

def ids(self):
    con = lite.connect('foo.db')

    with con:

        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")

    while True:

        ids = cur.fetchall()

        if ids == None:
            continue

        return ids

そして、4つの行があるので、私の出力コードは次のとおりです。

 print ''.join(ids[0]) + ',' + ''.join(ids[1]) + ',' + ''.join(ids[2])
 + ',' + ''.join(ids[3])

だから私の質問は、何も表示せず、実際に存在する行を残すだけの既存の行がない場合に例外を作成する方法です。私はやってみif ids[0] is not None: #do somethingましたが、それは私のコードを本当に遅くし、それは私が推測する非pythonicな方法です。それを機能させるためのより良い方法はありますか?どんな助けでもありがたいです。

4

1 に答える 1

1

あなたは4行を持っていないようです。汎用にして、任意の数の行を結合するだけです。

ids = someobject.ids()
print ','.join(''.join(row) for row in ids)

データベース クエリを簡素化できます。クエリを「ポーリング」する必要はありません。

def ids(self):
    with lite.connect('foo.db') as con:
        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")
        return cur.fetchall()

カーソルを直接ループすることもできます。フェッチすると、データベースがバッファリングを処理します。

def ids(self):
    with lite.connect('foo.db') as con:
        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")
        return cur   # just the cursor, no fetching

ids = someobject.ids()
# this'll loop over the cursor, which yields rows as required
print ','.join(''.join(row) for row in ids)
于 2013-03-15T20:12:08.037 に答える