1

Python で sqlite3 を使用していますが、Python クラスを使用して同じデータベース テーブルに対して Cursor オブジェクトと Row オブジェクトを選択する方法があるかどうか疑問に思っていました。

言い換えれば、私はこのようなことをすることができます:

class get_db:
  def __init__(self, dbpath):
    con = sqlite3.connect(dbpath, isolation_level=None)
    self.tups = con.cursor()

    con.row_factory = sqlite3.Row
    self.dict = con.cursor()

次に、次の方法で同じ値を返すことができます。

db = get_db('/path/to/sql.db')
db.tups.execute("SELECT * FROM table WHERE id=24").fetchone()[0]  # For the first tuple element
db.dict.execute("SELECT * FROM table WHERE id=24").fetchone()['id'] # Which is the first tuple element as well

現在、接続を作成するときにどちらかを選択する必要があるようです。上記の例は、row_factory が最後に呼び出されたので、Row オブジェクトを返します。

4

1 に答える 1

1

考慮すべき重要な点は、接続オブジェクトの execute メソッドが省略形であることです。透過的にカーソルを作成し、そのカーソルの実行メソッドを返します。

接続オブジェクトのrow_factory属性をsqlite3.Rowに設定すると、接続全体で行われます。この接続によって作成されたカーソルは、row_factoryに設定されます。

あなたがおそらくやりたいことは

class get_db:
    def __init__(self, dbpath):
        con = sqlite3.connect(dbpath, isolation_level=None)
        self.tups = con.cursor()

        self.dict = con.cursor()
        self.dict.row_factory = sqlite3.Row

self.dict カーソルのみが変更された row_factory を取得するようにします。

于 2013-11-01T01:17:18.223 に答える