Pythonでpsycopg2を使用して、いくつかの値をpostgres文字フィールドに渡します。一部の文字列値には、ピリオド、スラッシュ、引用符などが含まれています。
MySQLでは文字列をエスケープするだけです
MySQLdb.escape_string(my_string)
Psycopg2に相当するものはありますか?
エスケープは自動的に行われます。電話するだけです。
_cursor.execute("query with params %s %s", ("param1", "pa'ram2"))
_
(python%演算子がnot使用されていることに注意してください)、値は正しくエスケープされます。
extensions.adapt(var)
を使用して変数を手動でエスケープできますが、これはエラーが発生しやすく、接続エンコーディングを考慮していません。通常のクライアントコードで使用されることになっていますnot。
のように ピロが言った エスケープは自動的に行われます。ただし、 cursor.mogrify(sql、[params]) を使用して、psycopg2によってエスケープされた完全なSQLを返すメソッドもあります。
万が一、クエリパラメータが十分でなく、文字列を自分でエスケープする必要がある場合は、 Postgresエスケープ文字列定数 をPythonのrepr
と一緒に使用できます(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
バージョン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__)
Psycopg2にはそのような方法はありません。 Python値をISQLQuoteオブジェクトに適合させるための 拡張子 があり、これらのオブジェクトにはPostgreSQL互換値を返すためのgetquoted()
メソッドがあります。
使用方法の例については、このブログを参照してください。
psycopg2を使用したSQLステートメントのバインドされた値の引用
更新2019-03-03:9年後にオリジナルが利用できなくなったため、archive.orgへのリンクを変更しました。