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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:20:32