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

