MySQLdbもoursqlも、連続する実行のパラメータによって満たされた準備済みステートメントを返すことを許可しません。他にもありますか?
SQL ステートメントは送信されたすべての値に対して 1 回だけ準備されるため、少なくとも.executemany()
oursqlはMySQLdbよりも熟練しているようです。
(Python は PostgreSQL でのプリペアド ステートメントの準備と再利用をサポートしていますか?)
MySQLdbもoursqlも、連続する実行のパラメータによって満たされた準備済みステートメントを返すことを許可しません。他にもありますか?
SQL ステートメントは送信されたすべての値に対して 1 回だけ準備されるため、少なくとも.executemany()
oursqlはMySQLdbよりも熟練しているようです。
(Python は PostgreSQL でのプリペアド ステートメントの準備と再利用をサポートしていますか?)
PostgreSQL の質問については、少なくとも昨年 10 月の時点では、準備済みステートメントを処理する Python 固有の方法はありません (私は Python プログラマーではありませんが、これは言語間でかなり一般的です)。ただし、PostgreSQL はこれを行うための SQL 言語の方法を提供しているため、SQL クエリを実行できる場合、どの言語でも準備済みステートメントを使用できます。Python でこれを行う方法のコード例については、http://initd.org/psycopg/articles/2012/10/01/prepared-statements-psycopg/を参照してください。
ただし、いくつかの大きな注意事項があります。その 1 つは、準備済みステートメントが最初の実行時に計画され、その計画が再利用されることです。これは、同じプランが均一に必要なクエリ (単純な挿入など) ではうまく機能しますが、新しいプランが必要になるほどパラメーターが変更される可能性があるという問題が発生します。したがって、ほとんどの場合、次のことで問題ない可能性があります (注意が必要な厄介なケースがまだあります)。
INSERT INTO foo (bar) values ($1)
SELECT * FROM foo WHERE bar= $1;
bar が主キーであると仮定次のようなものは安全ではない可能性があります。
SELECT * FROM foo WHERE bar < $1
SELECT * FROM foo WHERE baz = $1
ここで、baz には、同じ値を持つ行の大部分が含まれる場合があります。