Python で psycopg2 を使用して、いくつかの値を postgres 文字フィールドに渡しています。一部の文字列値には、ピリオド、スラッシュ、引用符などが含まれています。
MySQLでは、文字列をエスケープするだけです
MySQLdb.escape_string(my_string)
psycopg2 に相当するものはありますか?
Python で psycopg2 を使用して、いくつかの値を postgres 文字フィールドに渡しています。一部の文字列値には、ピリオド、スラッシュ、引用符などが含まれています。
MySQLでは、文字列をエスケープするだけです
MySQLdb.escape_string(my_string)
psycopg2 に相当するものはありますか?
エスケープは自動的に行われます。次のように呼び出すだけです。
cursor.execute("query with params %s %s", ("param1", "pa'ram2"))
(python % 演算子が使用されていないことに注意してください)、値は正しくエスケープされます。
を使用して変数を手動でエスケープできますextensions.adapt(var)
が、これはエラーが発生しやすく、接続エンコーディングを考慮に入れません。通常のクライアント コードで使用することは想定されていません。
クエリ パラメータが十分ではなく、自分で文字列をエスケープする必要がある場合は、Python の文字列定数と一緒にPostgres のエスケープ文字列定数repr
を使用できます(非 ASCII 文字と Unicode 文字をエスケープするための Python の規則は Postgres のものと同じであるため)。
def postgres_escape_string(s):
if not isinstance(s, basestring):
raise TypeError("%r must be a str or unicode" %(s, ))
escaped = repr(s)
if isinstance(s, unicode):
assert escaped[:1] == 'u'
escaped = escaped[1:]
if escaped[:1] == '"':
escaped = escaped.replace("'", "\\'")
elif escaped[:1] != "'":
raise AssertionError("unexpected repr: %s", escaped)
return "E'%s'" %(escaped[1:-1], )
Psycopg2 にはそのような方法はありません。Python の値を ISQLQuote オブジェクトに適応させるための拡張機能getquoted()
があり、これらのオブジェクトにはPostgreSQL 互換の値を返すメソッドがあります。
使用方法の例については、このブログを参照してください。
psycopg2 を使用して SQL ステートメントでバインドされた値を引用する
2019 年 3 月 3 日更新: archive.org へのリンクを変更しました。これは、9 年後にオリジナルが利用できなくなったためです。
psycopg2
バージョン 2.7 にメソッドを追加したようです:
http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.quote_ident
from psycopg2.extensions import quote_ident
with psycopg2.connect(<db config>) as conn:
with conn.cursor() as curs:
ident = quote_ident('foo', curs)
次のようなエラーが発生した場合は、次の
TypeError: argument 2 must be a connection or a cursor
いずれかを試してください。
ident = quote_ident('foo', curs.cursor)
# or
ident = quote_ident('food', curs.__wrapper__)