#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