【问题标题】:Python/MySQL query error: `Unknown column`Python/MySQL 查询错误:`未知列`
【发布时间】: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)

【问题讨论】:

    标签: python mysql command-line mysql-connector


    【解决方案1】:
    "INSERT INTO fruit (name, variety) VALUES (%s, %s)" % ("watermelon", "melon")
    

    真的变成了

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

    watermelonmelon 不是字符串,而是列。要解决此问题,请在您的 %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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2013-07-11
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多