Ошибка запроса Python / MySQL: `Неизвестный столбец`

#python #mysql #web-applications

#python #mysql #командная строка #mysql-connector

Вопрос:

Этот скрипт предназначен для использования в качестве интерфейса командной строки для добавления записей в локально размещенную базу данных MySQL.

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

mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'watermelon' in 'field list'

Но арбуз — это значение, которое я пытаюсь ввести, а не имя столбца!

Вот сценарий:

 #! /usr/bin/python

#use command line as front end to enter new rows into locally hosted mysql database

import mysql.connector

#create inputs
new_fruit = raw_input('What fruit do you want to add? ')
new_fruit_type = raw_input('Which type of '   new_fruit   '? ')

#connect to dbase
conn = mysql.connector.connect(user='root', password='xxxx', database='play')

#instansiate cursor
cursor = conn.cursor()

#define sql statement
add_record = "INSERT INTO fruit (name, variety) VALUES (%s, %s)" % (new_fruit, new_fruit_type)

#execute sql
cursor.execute(add_record)

#close out
conn.commit()
cursor.close()
conn.close()
 

И схема таблицы:

 mysql> describe fruit;
 --------- ---------- ------ ----- --------- ---------------- 
| Field   | Type     | Null | Key | Default | Extra          |
 --------- ---------- ------ ----- --------- ---------------- 
| id      | int(11)  | NO   | PRI | NULL    | auto_increment |
| name    | char(30) | YES  |     | NULL    |                |
| variety | char(30) | YES  |     | NULL    |                |
 --------- ---------- ------ ----- --------- ---------------- 
3 rows in set (0.00 sec)
 

Ответ №1:

 "INSERT INTO fruit (name, variety) VALUES (%s, %s)" % ("watermelon", "melon")
 

Буквально становится

 INSERT INTO fruit (name, variety) VALUES (watermelon, melon)
 

Вместо строк watermelon и melon являются столбцами. Чтобы исправить это, заключите свой текст в кавычки %s .

 "INSERT INTO fruit (name, variety) VALUES ('%s', '%s')" % (new_fruit, new_fruit_type)
 

Однако вы должны запустить его как:

 cursor.execute("INSERT INTO fruit (name, variety) VALUES (%s, %s)", (new_fruit, new_fruit_type));
 

Обратите внимание, что мы убрали кавычки вокруг %s и передаем переменные в качестве второго аргумента execute метода. Execute предотвращает внедрение sql из переменных, а также заключает строки в кавычки.

Для получения дополнительной информации см. http://mysql-python.sourceforge.net/MySQLdb.html#some-examples

Ответ №2:

Проблема здесь:

 add_record = "INSERT INTO fruit (name, variety) VALUES (%s, %s)" % (new_fruit, new_fruit_type)
 

Представьте, какой запрос это приведет:

 INSERT INTO fruit (name, variety) VALUES (watermelon, something_else)
 

Эти значения больше не являются значениями! Они больше похожи на ссылки на столбцы ( Unknown column 'watermelon' in 'field list' )

Вместо этого вы должны использовать подготовленные инструкции:

 query = "INSERT INTO fruit (name, variety) VALUES (%s, %s)"
cursor.execute(query, (new_fruit, new_fruit_type))
 

Это автоматически позаботится о параметризации для вас и предотвратит внедрение SQL