0

我在尝试插入表'produto'时收到此错误:

回溯(最后一次调用):文件“C:\Python33\Archive\MySQL-teste12.py”,第 278 行,inserir(cursor, cx2) 文件“C:\Python33\Archive\MySQL-teste12.py”,第 196 行,在 inserir cursor.execute(add_produto) 文件“C:\Python33\lib\site-packages\mysql\connector\cursor.py”中,第 415 行,在执行 self._handle_result(self._connection.cmd_query(stmt) ) 文件“C:\Python33\lib\site-packages\mysql\connector\connection.py”,第 593 行,在 cmd_query 结果 = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) 文件“C:\ Python33\lib\site-packages\mysql\connector\connection.py",第 515 行,在 _handle_result 中引发 errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'dado' in 'field列表'

这是表格:

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 中的引号也弄乱了,但只给出了不同的错误消息。

谢谢你的帮助。

4

1 回答 1

5

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

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 注入机会。

而且它使数据库更难弄清楚如何缓存和重用已编译的查询,因为每次插入时,它都是不同的语句。

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

当然。add_produto是一个字符串,所以*add_produto只是将该字符串的每个字符作为单独的参数传递,这不会有任何好处。

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

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

如果你打印出来add_produto,你会看到加引号'vc'并没有在变量的值周围加引号vc,它使用文字字符串'vc'而不是变量的值。所以,它不会解决你的问题。

于 2013-10-05T00:34:31.267 回答