首次实现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
相关产品推荐
相关产品推荐

