Python/MySQL 查询错误:`未知列`
Posted
技术标签:
【中文标题】Python/MySQL 查询错误:`未知列`【英文标题】:Python/MySQL query error: `Unknown column` 【发布时间】:2013-11-01 20:48:04 【问题描述】:此脚本旨在充当命令行前端,将记录添加到本地托管的 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 Injection
【讨论】:
以上是关于Python/MySQL 查询错误:`未知列`的主要内容,如果未能解决你的问题,请参考以下文章
查询中的错误 (1054):“where 子句”中的未知列“TableValue”
错误代码:1054。“where 子句”中的未知列“sdate”