29

Python で psycopg2 を使用して、いくつかの値を postgres 文字フィールドに渡しています。一部の文字列値には、ピリオド、スラッシュ、引用符などが含まれています。

MySQLでは、文字列をエスケープするだけです

MySQLdb.escape_string(my_string)

psycopg2 に相当するものはありますか?

4

5 に答える 5

37

エスケープは自動的に行われます。次のように呼び出すだけです。

cursor.execute("query with params %s %s", ("param1", "pa'ram2"))

(python % 演算子が使用されていないことに注意してください)、値は正しくエスケープされます。

を使用して変数を手動でエスケープできますextensions.adapt(var)が、これはエラーが発生しやすく、接続エンコーディングを考慮に入れません。通常のクライアント コードで使用することは想定されていません。

于 2010-10-06T10:06:21.097 に答える
4

クエリ パラメータが十分ではなく、自分で文字列をエスケープする必要がある場合は、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], )
于 2015-05-14T22:51:25.230 に答える
0

Psycopg2 にはそのような方法はありません。Python の値を ISQLQuote オブジェクトに適応させるための拡張機能getquoted()があり、これらのオブジェクトにはPostgreSQL 互換の値を返すメソッドがあります。

使用方法の例については、このブログを参照してください。

psycopg2 を使用して SQL ステートメントでバインドされた値を引用する

2019 年 3 月 3 日更新: archive.org へのリンクを変更しました。これは、9 年後にオリジナルが利用できなくなったためです。

于 2010-09-29T16:40:25.233 に答える
0

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__)

于 2019-11-19T01:45:30.787 に答える