31

RDBMS (MySQL および PostgreSQL) で Python を使用してきましたが、カーソルの使用方法を本当に理解していないことに気付きました。

通常、クライアント DB-API (psycopg2 や MySQLdb など) を介してスクリプトを DB に接続します。

connection = psycopg2.connect(host='otherhost', etc)

次に、カーソルを作成します。

cursor = connection.cursor()

そして、クエリとコマンドを発行できます。

cursor.execute("SELECT * FROM etc")

クエリの結果はどこにあるのでしょうか。それはサーバー上にありますか?またはクライアントで少し、サーバーで少し?そして、いくつかの結果にアクセスする必要がある場合は、それらを取得します:

rows = cursor.fetchone() 

また

rows = cursor.fetchmany()

ここで、すべての行を取得するわけではなく、別のクエリを実行することにした場合、以前の結果はどうなるでしょうか? それらはオーバーヘッドです。

また、コマンドのすべての形式に対してカーソルを作成し、それらの同じコマンドに対して何らかの方法で継続的に再利用する必要があります。psycopg2 は、何度も実行されるが異なる値を持つコマンドを何らかの方法で最適化できると思いますが、どのように価値がありますか?

どうも

4

3 に答える 3

2

PostgreSQLを使用していると仮定すると、カーソルはデータベースのネイティブカーソルAPIを使用して実装されている可能性があります。純粋なPythonPostgreSQLDB-APIモジュールであるpg8000のソースコードを調べて、カーソルの処理方法を確認することをお勧めします。カーソルについては、PostgreSQLのドキュメントも参照してください。

于 2009-01-18T00:09:48.157 に答える
1

ここでmysqldb のドキュメントを見ると、カーソルに対してさまざまな戦略が実装されていることがわかります。したがって、一般的な答えは次のとおりです。

編集: これはmysqldb API ドキュメントです。各カーソルタイプがどのように動作するかについての情報があります。標準カーソルは、結果セットをクライアントに格納しています。したがって、すべての結果行を取得しないとオーバーヘッドがあると思います。フェッチしない行でさえ、クライアントに転送する必要があるためです (潜在的にネットワーク経由で)。私の推測では、postgresql とそれほど変わらないと思います。

When you want to optimize SQL statements that you call repeatedly with many values, you should look at cursor.executemany(). It prepares a SQL statement so that it doesn't need to be parsed every time you call it:

cur.executemany('INSERT INTO mytable (col1, col2) VALUES (%s, %s)',
                [('val1', 1), ('val2', 2)])
于 2009-01-18T08:38:08.363 に答える