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

无法向PostgreSQL表执行INSERT但可正常UPDATE的问题求助

问题排查与解决方法

1. 修复游标变量名错误

你的INSERT函数存在明显的变量名不匹配问题:创建的游标是bc,但后续调用fetchone()时误用了UPDATE代码里的游标名bclogon,这会直接触发未定义变量的错误(如果你的异常信息是笔误,这是核心问题)。

修改后的代码:

def insertIP(ipx, stac, macx):
    hojenow = datetime.now()
    bc = con.cursor()
    # 直接传递datetime对象,psycopg2会自动转换为timestamp类型,无需手动转字符串
    sql = "INSERT INTO ip_comp (nome_comp, mac, ip_data, ip) VALUES (%s, %s, %s, %s) RETURNING id_ip"
    data = [stac, macx, hojenow, ipx]
    bc.execute(sql, data)
    # 使用创建的游标bc获取返回值
    result = bc.fetchone()
    con.commit()
    # 返回完整的id值,而非字符串的第一个字符
    return str(result[0]) if result else None

2. 验证异常信息准确性

你提到的异常Error name 'ip' is not defined是Python的NameError,但函数代码中并未直接使用ip变量,可能的原因:

  • 调用insertIP时传入了未定义的ip变量,比如写成insertIP(ip, "test", "aa:bb:cc")而非insertIP(ipx, "test", "aa:bb:cc")
  • 异常信息记录有误,实际是游标变量bclogon未定义的错误

3. 额外优化建议

  • 添加异常处理:捕获数据库操作可能出现的异常(比如重复IP违反唯一约束、字段类型不匹配等),便于调试:
def insertIP(ipx, stac, macx):
    try:
        hojenow = datetime.now()
        bc = con.cursor()
        sql = "INSERT INTO ip_comp (nome_comp, mac, ip_data, ip) VALUES (%s, %s, %s, %s) RETURNING id_ip"
        data = [stac, macx, hojenow, ipx]
        bc.execute(sql, data)
        result = bc.fetchone()
        con.commit()
        return str(result[0]) if result else None
    except Exception as e:
        con.rollback()
        print(f"插入失败: {str(e)}")
        raise
  • 避免全局连接:全局数据库连接con在多线程/多进程场景下易出问题,建议在函数内部管理连接或使用连接池。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:13:39