Flask+SQLAlchemy应用中如何避免向数据库插入空值数据
问题描述
首次开发Flask应用并使用SQLAlchemy创建数据库,已成功创建数据表,但提交表单后数据库中出现大量空值数据,认为问题出在数据插入环节。由于缺乏数据库经验,虽知晓问题简单,但仍难以解决。
Python代码
def template(): if request.method == "POST": company_name = request.form["company"] address_name = request.form["address"] host_name = request.form["host"] port_name = request.form["port"] user_name = request.form["user"] password_name = request.form["password"] company_new = Camera(company=company_name) address_new = Camera(address=address_name) host_new = Camera(host=host_name) port_new = Camera(port=port_name) user_new = Camera(user=user_name) password_new = Camera(password = password_name) try: db.session.add(company_new) db.session.add(address_new) db.session.add(host_new) db.session.add(port_new) db.session.add(user_new) db.session.add(password_new) db.session.commit() return redirect('/template') except OSError as e: print("Error: %s" % (e.strerror))
HTML代码
<div class="form-group"> <label class="control-label col-sm-2" for="company">企业:</label> <div class="col-sm-5"> <input class="form-control" name="company" id="company" required> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="address">地址:</label> <div class="col-sm-5"> <input class="form-control" name="address" id="address" required> </div> </div> . . . <div class="col-sm-offset-2 col-sm-10"> <button id="submit" type="submit" class="form-button"><i class="fa fa-save"></i> 连接</button><br> </div> </form>
数据库结果
id company address port host user password date 1 dwds null null null null null 2022-09-05 20:22:48.940506 2 null sds null null null null 2022-09-05 20:22:48.944498 3 null null sd null null null 2022-09-05 20:22:48.945148 4 null null null s null null 2022-09-05 20:22:48.945148 5 null null null null s null 2022-09-05 20:22:48.945148 6 null null null null null s 2022-09-05 20:22:48.945827
解决方案
问题根源
你当前的代码为每个表单字段单独创建了一个Camera实例,然后把这6个实例都添加到数据库会话并提交。这会导致数据库生成6条独立记录,每条仅包含一个字段的值,其余字段自然为空——这就是你看到的结果。
修正后的Python代码
def template(): if request.method == "POST": # 从表单获取所有字段值 company_name = request.form["company"] address_name = request.form["address"] host_name = request.form["host"] port_name = request.form["port"] user_name = request.form["user"] password_name = request.form["password"] # 仅创建一个Camera实例,传入所有字段值 camera_new = Camera( company=company_name, address=address_name, host=host_name, port=port_name, user=user_name, password=password_name ) try: db.session.add(camera_new) # 只添加这一个实例 db.session.commit() return redirect('/template') except OSError as e: print("Error: %s" % (e.strerror)) db.session.rollback() # 异常时回滚会话,避免脏数据残留
额外提示
- HTML表单部分无需修改,输入框的
name属性和后端获取的键完全对应,且已添加required校验,能确保用户提交所有必填字段。 - 异常处理中添加
db.session.rollback()是好习惯,防止提交失败时会话中残留未完成的操作,影响后续数据库交互。 - 确认你的
Camera模型已正确定义所有对应字段(company、address、host、port、user、password),字段的可空性设置符合业务需求。
内容的提问来源于stack exchange,提问作者user19270352
相关产品推荐
相关产品推荐

