0

JDBC ( zxJDBC ) / SQLiteを使用したJythonの準備済みステートメントを探しています。私が見つけたのは、次のような例です(Jythonのドキュメント):

qry = "select continent from country where name = ?"
cursor.executemany(qry,['Austria'])

ただし、プレースホルダーに挿入された値を知らなくても、データベースがステートメントを最適化できるようにする方法として、準備済みステートメントを常に理解していました。次に、オプティマイザーを介して渡されたこのステートメントへのハンドルを受け取り、これをさまざまな値で実行して、クエリの最適化の労力を節約できるため、次のアプローチの方が優れていると思います。

qry = cursor.prepare("SELECT * FROM `table` WHERE `field`=? AND `field2`=?") #usually mor complex queries
qry.execute(cursor, ?, (val1, val2)??) #here is the problem

残念ながら、実行の使用方法の例を見つけることができず、ドキュメントも不足しています。

PyStatement.execute(cursor, params, bindings)

paramsが目的で、どのように使用するかについての私の推測bindingsが正しいかどうかを説明していただけますか. params についての私の最良の推測は、それらがsetIntJavas JDBC の -Method (または同様のもの) への最初のパラメーターであるということです。これはかなり驚くべきことです。私は、Jython がより手短に扱われ、単純に正しい (前から後ろへ) 順序でパラメーターを期待することを期待していました。

ボーナス: 結果セットを解放する方法はありますか? (カーソルを閉じる以外に)

4

1 に答える 1

1

この拡張機能は通常のPython データベース仕様 v2を使用しているようです

それexecuteは言う:

操作への参照は、カーソルによって保持されます。同じ操作オブジェクトが再度渡された場合、カーソルはその動作を最適化できます。これは、同じ操作が使用されているが、異なるパラメーターが (何度も) バインドされているアルゴリズムで最も効果的です。

そしてexecutemanyそれは言う:

.execute() と同じコメントが、このメソッドにも適用されます。

したがって、このドライバーがこれらの提案されたセマンティクスを実際に実装している場合は、同じ文字列を準備済みステートメントに渡すexecuteexecutemany、再利用する必要がありますが、実装を確認する (または実装者に問い合わせる) ことをお勧めします。

于 2012-05-31T18:14:51.983 に答える