Подтвердить что ты не робот

Psycopg2 эквивалент mysqldb.escape_string?

Я передаю некоторые значения в поле символов postgres, используя psycopg2 в Python. Некоторые из строковых значений содержат периоды, косые черты, кавычки и т.д.

С MySQL я бы просто избежал строки с

MySQLdb.escape_string(my_string)

Существует ли эквивалент для psycopg2?

4b9b3361

Ответ 1

Эскапирование происходит автоматически, вам просто нужно позвонить:

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

(обратите внимание, что оператор python% не), и значения будут правильно экранированы.

Вы можете избежать вручную переменной с помощью extensions.adapt(var), но это будет подвержено ошибкам и не будет учитывать кодировку соединения: предполагается, что не используется в обычном клиентском коде. p >

Ответ 2

Как пиро сказал, экранирование происходит автоматически. Но есть метод, который также возвращает полный sql, экранированный psycopg2, используя cursor.mogrify(sql, [params])

Ответ 3

Psycopg2 не имеет такого метода. Он имеет extension для адаптации значений Python к объектам ISQLQuote, и эти объекты имеют метод getquoted() для возврата значений, совместимых с PostgreSQL.

Смотрите этот блог для примера того, как его использовать: Цитирование связанных значений в операторах SQL с помощью psycopg2

Ответ 4

В маловероятном случае, когда параметры запроса недостаточны, и вам нужно избегать строк самостоятельно, вы можете использовать Postgres escape строки string вместе с Python repr (потому что правила Python для экранирования символов non-ascii и unicode такие же, как и для 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], )