Python mysql.connector.errors. % s передано в SQL-запрос с кавычками

Я выполняю следующий код в Python

cursor.execute('SHOW DATABASES;') ans_dblist = cursor.fetchall() for db_name in ans_dblist: cursor.execute('SHOW TABLES FROM %s;', (db_name[0],)) ans_tbl = cursor.fetchall() print ans_tbl 

И я получаю эту ошибку:

 Traceback (most recent call last): File "./mysqlcon.py", line 12, in <module> cursor.execute('SHOW TABLES FROM %s;', (db_name[0],)) File "/usr/lib/python2.6/site-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 640, in _handle_result raise errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''information_schema'' at line 1 

Почему %s заменяется кавычками? SQL-запрос найдет базовую «информационную схему» вместо информационной схемы (без кавычек).

3 Solutions collect form web for “Python mysql.connector.errors. % s передано в SQL-запрос с кавычками”

Тот факт, что MySQLPython использует стандартный маркер формата строки («%») для замещающих переменных в запросах, может сбить с толку.

Заместители запросов в db-api python относятся к значениям, используемым в случаях, where содержатся предложения и инструкции insert и update , и должным образом santized / escaped / quoted db-api, чтобы избежать инъекций SQL и т. Д. Они не должны использоваться для таблицы или имена полей.

Итак, вы хотите создать свой запрос, используя строковое форматирование:

 sql = 'SHOW TABLES FROM %s;' % (db_name[0],) cursor.execute(sql) 

Поскольку db_name[0] поступает из надежного источника, здесь нет никакой проблемы с безопасностью.

Я слышал, что использование% для форматирования также небезопасно, или это неправильно? Я пытаюсь использовать% для формата, но «% s» запоминает значение из предыдущего запроса, и когда я выполняю следующий запрос, я получаю следующий ответ:

 mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'test.CHARACTER_SETS' doesn't exist 

Табл. "Test.CHARACTER_SETS" не существует, я знаю это. «test» – это база данных, а «CHARACTER_SETS» – это имя таблицы.

Мой полный код, прост:

 import mysql.connector cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='test') cursor = cnx.cursor() cursor.execute('SHOW DATABASES;') ans_dblist = cursor.fetchall() for db_name in ans_dblist: cursor.execute("SHOW TABLES FROM %s" % db_name[0]) ans_tbl = cursor.fetchall() print ans_tbl for tbl_name in ans_tbl: cursor.execute("SHOW COLUMNS FROM %s where extra like 'auto_increment';" % tbl_name[0]) #There tbl_name[0]=CHARACTER_SETS, but %s=test.CHARACTER_SET. In above query %s=test, but why it passed to next query I don't know. column_autoincrement = cursor.fetchone() 

Также я пытаюсь использовать словарь, %(db_name)s переданный в SQL-запросе, с кавычками.

  cursor.execute("SHOW TABLES FROM %(db_name)s", {'db_name':db_name[0]}) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''information_schema'' at line 1 

Я использую format метода:

 cursor.execute("SHOW TABLES FROM {0}".format(db_name[0])) 

И это сработало! 🙂

  • django.core.exceptions.ImproperlyConfigured: Ошибка при загрузке модуля MySQLdb: нет модуля с именем MySQLdb
  • Python + MySQLdb странная проблема
  • Обновление базы данных с несколькими SQL-данными
  • Синтаксис Peewee для выбора нулевого поля
  • Python zlib output, как восстановить из таблицы mysql utf-8?
  • Ошибка Django AWS RDS MySQL: (2026, «Ошибка подключения SSL: ошибка: 00000001: lib (0): func (0): reason (1)»)
  • Невозможно установить msqlclient для django / python3
  • Обновление нескольких столбцов с использованием объекта django F ()
  • Python - лучший язык программирования в мире.