mysqldb Python сбежал? или% s? - PullRequest
4 голосов
/ 22 марта 2010

Я сейчас использую mysqldb.

Как правильно экранировать строки в аргументах mysqldb?

Обратите внимание, что E = lambda x: x.encode('utf-8') 1) поэтому мое соединение установлено с помощью charset = 'utf8'.

Вот ошибки, которые я получаю для этих аргументов: w1, w2 = u'你好', u'我好'

self.cur.execute("SELECT dist FROM distance WHERE w1=? AND w2=?", (E(w1), E(w2)))
ret = self.cur.execute("SELECT dist FROM distance WHERE w1=? AND w2=?", (E(w1), E(w2)))

Файл "build / bdist.linux-i686 / egg / MySQLdb / cursors.py", строка 158, в исполнении Ошибка типа: не все аргументы, преобразованные во время форматирования строки

self.cur.execute("SELECT dist FROM distance WHERE w1=%s AND w2=%s", (E(w1), E(w2)))

Это прекрасно работает, но когда w1 или w2 имеют \ inside, то выход из строя, очевидно, не удался.

Лично я знаю, что% s не очень хороший метод для аргументации из-за инъекционных атак и т. Д.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2010

Чтобы быть более точным ... метод cursor.execute() принимает необязательный аргумент, который содержит значения, которые должны быть заключены в кавычки и интерполированы в шаблон / оператор SQL.Это НЕ делается с помощью простого оператора %!cursor.execute(some_sql, some_params) равно НЕ так же, как cursor.execute(some_sql % some_params)

* *1000* Python DB-API указывает, что любой совместимый драйвер / модуль должен предоставлять атрибут .paramstyle, который можетбыть любым из 'qmark', 'numeric', 'named', 'format' или 'pyformat' ... так, чтобы теоретически можно было адаптировать строки SQL-запроса к поддерживаемой форме с помощью самоанализа и небольшого манипулирования.Это все же должно быть безопаснее, чем пытаться заключать в кавычки и интерполировать значения в свои строки SQL самостоятельно.

Мне было особенно приятно читать Внимание Никогда, никогда, НИКОГДА не использовать строку Python ... интерполяцию.. Даже не под дулом пистолета. в документах PsycoPG.

1 голос
/ 22 марта 2010

Если я правильно помню, тогда вам не нужно вручную кодировать строки Unicode.Модуль mysqldb сделает это за вас.

И модуль mysqldb использует %s в качестве параметров вместо ?.Это причина ошибки в вашем первом примере.

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

Вы можете использовать тройные кавычки и формат необработанной строки

self.cur.execute(r"""SELECT dist FROM distance ... """,...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...