Python连接MySQL执行INSERT语句报name 'declaracao'未定义错误求助
错误原因1:变量名不匹配
你在elif分支里定义的变量是declaracao1(末尾带数字1),后续调用变量时写的是declaracao(没有末尾的1),解释器找不到对应变量,就会抛出未定义错误。
错误原因2:SQL语句语法错误
你写的INSERT语句里存在多余符号:VALUES ('{nrkpedido}', '{knome}', '{kendereco}',}', '{knumero}') 中'{kendereco}'后面多了一个},后续执行SQL时也会触发语法错误。
错误原因3:取值和占位符逻辑错误
你给p/n/e/nu赋值的是'kpedido'这类字符串常量,不是取表单输入的实际值,同时SQL里的占位符没有做格式化替换,打印出来的都是占位符原文,不是实际要插入的业务数据。
错误原因4:必填校验逻辑错误
开头的if判断逻辑写反了,现在是所有字段全为空的时候才弹出补全提示,只要有一个字段填了内容就会跳过校验直接走插入逻辑,不符合必填校验的需求。
修改后可运行参考代码
if window == cadastro1 and event == 'Cadastrar': # 修正必填校验:任意字段为空就触发提示 if any([ values['knome'] == '', values['kpedido'] == '', values['kendereco'] == '', values['kcep'] == '', values['kbairro'] == '', values['kestado'] == '', values['kcomplemento'] == '', values['ktelefone'] == '', values['kcidade'] == '' ]): sg.popup('Preencha todos os campos') continue # 取表单实际输入值 nrkpedido = values['kpedido'] knome = values['knome'] kendereco = values['kendereco'] knumero = values['knumero'] # 修正SQL语法,替换占位符 declaracao = f"INSERT INTO cadteste(nrpedido, nome, endereco, numero) VALUES ('{nrkpedido}', '{knome}', '{kendereco}', '{knumero}')" sql = declaracao print(sql)
补充建议:正式运行时不要用字符串拼接的方式生成SQL,改用对应数据库驱动的参数化查询方法,可避免SQL注入风险,比如sqlite3可以写成
cursor.execute("INSERT INTO cadteste(nrpedido, nome, endereco, numero) VALUES (?, ?, ?, ?)", (nrkpedido, knome, kendereco, knumero))。
内容的提问来源于stack exchange,提问作者Pedro Cabral
相关产品推荐
相关产品推荐

