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

psycopg2执行INSERT后表无数据,调用commit()仍无效求助

问题:psycopg2执行批量INSERT无后续输出且数据未插入

已确认Python脚本通过psycopg2成功连接PostgreSQL(能执行select version()),脚本和数据库均运行在Docker Compose默认网络中。但执行脚本时仅打印HERE,后续At commit() call和DONE INSERTING无输出,数据库中也无数据插入。脚本代码如下:

def main():
    import psycopg2

    conn = psycopg2.connect(
        database='dbname',
        user='dbuser',
        password='dbuserpass',
        host='host',
        port= 'port'
    )
    
    cursor = conn.cursor()
    data = [
        ('red', 'R', '675445300'),
        ('red', 'R', '675445300'),
        ('blue', 'B', '675445301'),
        ('green', 'G', '675445302')
    ]

    print("HERE") # THIS PRINTS
    psycopg2.extras.execute_values(
        cursor,
        "INSERT INTO colors (name, init, code) VALUES (%s, %s, %s)",
        data
    )
    
    print("At commit() call") # THIS NEVER PRINTS
    
    conn.commit()
    cursor.close()
    conn.close()
    print("DONE INSERTING") # THIS NEVER PRINTS

if __name__ == "__main__":
    main()

排查与解决思路

1. 未导入psycopg2.extras模块

脚本中调用了psycopg2.extras.execute_values,但仅导入了psycopg2,未导入extras子模块,会直接抛出ImportError,导致代码卡在execute_values调用处,后续代码无法执行。

解决方法:在导入部分添加import psycopg2.extras,或者改为:

from psycopg2 import extras
# 调用时用 extras.execute_values(...)

2. execute_values的SQL语句格式错误

psycopg2.extras.execute_values要求SQL语句的VALUES部分使用%s作为批量数据的占位符,而不是逐个字段的(%s, %s, %s)。原脚本的SQL写法会导致语法错误,触发数据库异常中断执行。

正确的SQL写法:

psycopg2.extras.execute_values(
    cursor,
    "INSERT INTO colors (name, init, code) VALUES %s",  # 改为VALUES %s
    data
)

3. 数据类型与表字段不匹配

检查colors表的字段类型:比如code字段如果定义为INT类型,但脚本中传入的是字符串(如'675445300'),会抛出DataError,中断代码执行。

解决方法:

  • 要么将脚本中的数据转为对应类型(比如把code的字符串转成整数:int('675445300'))
  • 要么修改表字段类型为VARCHAR匹配传入的字符串

4. 缺少异常捕获,无法定位错误

当前脚本没有任何异常处理逻辑,出错时直接崩溃但不输出错误信息,导致无法直观看到问题所在。

建议添加异常捕获:

def main():
    import psycopg2
    import psycopg2.extras

    conn = None
    cursor = None
    try:
        conn = psycopg2.connect(
            database='dbname',
            user='dbuser',
            password='dbuserpass',
            host='host',
            port= 'port'
        )
        cursor = conn.cursor()
        data = [
            ('red', 'R', 675445300),
            ('red', 'R', 675445300),
            ('blue', 'B', 675445301),
            ('green', 'G', 675445302)
        ]

        print("HERE")
        psycopg2.extras.execute_values(
            cursor,
            "INSERT INTO colors (name, init, code) VALUES %s",
            data
        )
        
        print("At commit() call")
        conn.commit()
        print("DONE INSERTING")
    except Exception as e:
        print(f"执行出错: {str(e)}")
        if conn:
            conn.rollback()
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:53:12