在尝试插入表'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中的引号,但只给出了不同的错误消息。
感谢您的帮助。
答案 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}}而不是变量的值。所以,它不会解决你的问题。