“字段列表”中的Python / MySQL未知列“数据”

时间:2013-10-05 00:23:42

标签: python mysql

在尝试插入表'produto'时,我发现了这个错误:

  

追踪(最近一次通话):     文件“C:\ Python33 \ Archive \ MySQL-teste12.py”,第278行,in       inserir(光标,cx2)     在inserir中的文件“C:\ Python33 \ Archive \ MySQL-teste12.py”,第196行       cursor.execute(add_produto)     文件“C:\ Python33 \ lib \ site-packages \ mysql \ connector \ cursor.py”,第415行,执行中       self._handle_result(self._connection.cmd_query(语句))     cmd_query中的文件“C:\ Python33 \ lib \ site-packages \ mysql \ connector \ connection.py”,第593行       result = self._handle_result(self._send_cmd(ServerCmd.QUERY,query))     文件“C:\ Python33 \ lib \ site-packages \ mysql \ connector \ connection.py”,第515行,在_handle_result中       引发errors.get_exception(包)   mysql.connector.errors.ProgrammingError:1054(42S22):'字段列表'中的未知列'dado'

这是表格:

produto = """
     CREATE TABLE produto (
     prod_nu int(11) NOT NULL AUTO_INCREMENT,
     nome varchar(30) NOT NULL,
     data_lcm date NOT NULL,
     preco int(11) NOT NULL,
     PRIMARY KEY (prod_nu)
     ) ENGINE=InnoDB
     """

以下是发生错误的插入过程:

def inserir (cursor, db):
menu3 = 0
while menu3 != 99:
    print("""
----- Menu Banco MARK II, v.1.00, MySQL, VR -----

          ----- Menu de Inserção ----


1.Inserir em produto.
2.Inserir em cliente.
3.Inserir em empregado.
4.Inserir em salario.
99.Sair.

    """)
    menu3 = input("Digite sua Opção")

    if menu3 == '1':
        va = input("""

                   Digite o Nome do Produto.

                   """)

        vb = input("""

                   Digite a data de Lançamento do Produto (Ano/mês/dia).

                   """)
        input_date = datetime.strptime(vb, '%Y/%m/%d')

        vc = input("""

                   Digite o Preço do Produto (ex: 20, 20.33).

                   """)

        add_produto = """INSERT INTO produto(nome,
              data_lcm, preco)
              VALUES (%s, %s, %s)"""% (va, 'input_date', 'vc')

        #try:
        cursor.execute(add_produto)
        db.commit()
        print("""
              Inserção concluida com sucesso.

              """)
        #except:
         #   db.rollback()
          #  print("""

           #     Erro.

            #    """)
    if menu3 == '99':
        break

我尝试添加* cursor.execute(* add_produto),但我收到了不同的错误消息。还插入了插入值va和vc中的引号,但只给出了不同的错误消息。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

永远不要写这样的代码:代码:

add_produto = """INSERT INTO produto(nome,
                 data_lcm, preco)
                 VALUES (%s, %s, %s)"""% (va, 'input_date', 'vc')

cursor.execute(add_produto)

相反,这样做:

add_produto = """INSERT INTO produto(nome,
                 data_lcm, preco)
                 VALUES (%s, %s, %s)"""

cursor.execute(add_produto, va, input_date, vc)

为什么?

嗯,首先,听起来你的问题是弄清楚如何在Python和SQL数据类型之间进行转换,正确引用和转义等等。数据库引擎已经知道如何做到这一点,所以只需让它为你。

最重要的是,尝试自己创建SQL injection机会。

这使数据库更难以弄清楚如何缓存和重用已编译的查询,因为每次进行插入时,都会有不同的声明。

  

我尝试添加* cursor.execute(* add_produto),但我收到了不同的错误消息。

不确定。 add_produto是一个字符串,因此*add_produto只是将该字符串的每个字符作为单独的参数传递,这不会有任何好处。

  

还插入了插入值va和vc中的引号,但只给出了不同的错误消息。

只是随意改变事物,直到它们看起来有效为止,这是编写似乎适用于某个特定情况的代码的好方法,但不适用于任何其他情况。编写实际有效的代码并不是一种好方法。如果你发现自己正在乱搞这样的“霰弹枪调试”策略,那就退后一步,问问自己字符串是什么问题以及原因。

如果您打印add_produto,您会看到在'vc'周围加上引号不会在变量vc的值周围加上引号,它会使用文字字符串{{ 1}}而不是变量的值。所以,它不会解决你的问题。