Хороший способ избежать кавычек в строке запроса базы данных? - PullRequest
28 голосов
/ 22 мая 2009

Я перепробовал всевозможные модули Python, и они либо избегают слишком много, либо неправильно. Какой самый лучший способ избежать кавычек (", ') в Python?

Ответы [ 9 ]

27 голосов
/ 22 мая 2009

Если это часть запроса к базе данных, вы можете использовать Параметризованный оператор SQL .

Помимо экранирования кавычек, он будет работать со всеми специальными символами и защитит вас от атак SQL-инъекций .

22 голосов
/ 18 февраля 2013

Использование json.dumps.

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"
9 голосов
/ 03 декабря 2012

Простой и стандартный способ экранирования строк и преобразования других объектов в программную форму состоит в использовании функции build in repr (). Он преобразует объект в представление, которое необходимо ввести с помощью ручного кода.

например:.

s = "I'm happy I am \"here\" now"
print repr(s)
>>  'I\'m happy I am "here" now'

Никаких странных хаков, он встроен и работает только для большинства целей.

2 голосов
/ 31 января 2018

Тройные одинарные кавычки удобно инкапсулируют одинарные кавычки, часто используемые в запросах SQL:

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
2 голосов
/ 18 июня 2016

Ответить на старую ветку, но лучший способ здесь отсутствует ...

Если используется psycopg2, он выполняется, -метод имеет встроенный выход.

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))

Обратите внимание, что вы предоставляете два аргумента для выполнения метода (string и tuple) вместо использования оператора Python% для изменения строки.

Ответ, украденный отсюда: psycopg2 эквивалент mysqldb.escape_string?

2 голосов
/ 12 марта 2010

Если вы используете psycopg2, у которого есть метод экранирования строк: psycopg2.extensions.adapt() См. Как явно указать значение строки (Python DB API / Psycopg2) для полного ответить

1 голос
/ 27 января 2012

Тройные двойные кавычки лучше всего избегать:

string = """This will span across 'single quotes', "double quotes",
and literal EOLs all in the same string."""
0 голосов
/ 16 мая 2019

В моем случае я сохранял абзац в базе данных, и где-то в этом абзаце мог быть какой-то текст с одинарной кавычкой (example: Charlie's apple sauce was soggy)

Я нашел, что это работает лучше всего:

database_cursor.execute('''INSERT INTO books.collection (book_name, book_quoted_text) VALUES ('%s', "%s")''' % (book_name, page_text.strip()))

Вы заметите, что я использую "" после переноса оператора INSERT в '''

0 голосов
/ 12 марта 2010

Для решения более общей проблемы у меня есть программа, в которой мне нужно было хранить любой набор символов в плоском файле с разделителями табуляции. Очевидно, что наличие вкладок в «наборе» вызывало проблемы.

Вместо output_f.write (str) я использовал output_f.write (repr (str)), что решило мою проблему. Читать медленнее, поскольку мне нужно eval () для ввода, когда я его читаю, но в целом это делает код чище, потому что мне больше не нужно проверять дополнительные случаи.

...