无法向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
相关产品推荐
相关产品推荐

