web-dev-qa-db-ja.com

mysqldb.escape_stringと同等のpsycopg2?

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

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

MySQLdb.escape_string(my_string)

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

25
AP257

エスケープは自動的に行われます。電話するだけです。

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

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

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

32
piro

のように ピロが言った エスケープは自動的に行われます。ただし、 cursor.mogrify(sql、[params]) を使用して、psycopg2によってエスケープされた完全なSQLを返すメソッドもあります。

9
notbad.jpeg

万が一、クエリパラメータが十分でなく、文字列を自分でエスケープする必要がある場合は、 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], )
2
David Wolever

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

0
getup8

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

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

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

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

0
Bill Karwin