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

首次实现CRUD操作遇报错:Dao.get()缺少必填参数'id'求排查

问题排查:更新功能报错 Dao.get() missing 1 required positional argument: 'id'

核心错误原因

更新接口代码中,未正确实例化DAO类:

# 错误写法:仅引用类,未创建实例
veicdao = VeiculoDao

get_veiculo是类的实例方法,必须通过类的实例调用。直接用类调用时,Python会将传入的id参数当作方法的self参数,导致实际缺少了id参数,触发报错。

修复步骤

将更新接口中的DAO实例化代码修改为:

# 正确写法:创建类的实例
veicdao = VeiculoDao()

与页面调用代码edit_veiculo中的写法保持一致,即可解决该报错。

额外优化建议

  • 规避SQL注入风险:当前DAO层使用f-string拼接SQL语句,存在注入漏洞,建议改用参数化查询:
def get_veiculo(self, id):
    conn = Database.get_connection()
    # 使用?作为占位符(适配SQLite,其他数据库可使用%s或命名占位符)
    response = conn.execute("""
        SELECT id, placa, modelo, ano, deadpool FROM veiculo WHERE id = ?
    """, (id,))
    row = response.fetchone()
    veiculo = Veiculo(
        row[1],
        row[2],
        row[3],
        row[4],
        id = row[0]
    )
    conn.close()
    return veiculo
  • 表单下拉框优化:HTML中deadpool的默认选项未设置value,提交时会传入空字符串,建议补充value或根据已有值设置默认选中:
<select id="deadpool" name="deadpool" class="form-control">
    <option value="">Selecione o setor...</option>
    <option {% if veiculo.deadpool == '1.O' %}selected{% endif %}>1.O</option>
    <option {% if veiculo.deadpool == '2.O' %}selected{% endif %}>2.O</option>
    <option {% if veiculo.deadpool == '3.O' %}selected{% endif %}>3.O</option>
    <option {% if veiculo.deadpool == '4.G' %}selected{% endif %}>4.G</option>
</select>
  • HTML标签修正:页面代码中的<l1>为错误标签,应改为<li>:
<ul class="page-nav">
    <li>
        <a class="btn btn-outline-success" href="{{url_for('veiculos_cadastrados')}}">Voltar</a>
    </li>
</ul>

内容的提问来源于stack exchange,提问作者Guilherme Lazarotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:05:58