You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:09:01