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 F ()
  • Flask-SQLAlchemy: не удается повторно подключиться до отмены отката транзакции
  • Можно ли добавить новый элемент на основе другой строки базы данных в SQLAlchemy?
  • Загрузка текста из .docx в MySQL с использованием Python-docx
  • Пилоны: совместное использование SQLAlchemy MySQL с внешней библиотекой
  • python: MYSQLdb. как получить имя столбца без выполнения select * в большой таблице?
  • Малина Pi crontab запускает скрипт py при загрузке -> протоколирование: ошибка mysql 2002 (не удается подключиться к локальному серверу)
  • Как заставить SQLAlchemy правильно вставлять многоточие в unicode в таблицу mySQL?
  • Может ли Django ORM выполнить ORDER BY по определенному значению столбца?
  • date time pass value from python to mysql
  • Установка MySQL-python
  • Python - лучший язык программирования в мире.