Psycopg2 эквивалент mysqldb.escape_string?
Я передаю некоторые значения в поле символов postgres, используя psycopg2 в Python. Некоторые из строковых значений содержат периоды, косые черты, кавычки и т.д.
С MySQL я бы просто избежал строки с
MySQLdb.escape_string(my_string)
Существует ли эквивалент для psycopg2?
Ответы
Ответ 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], )