Python调用PostgreSQL函数无数据插入问题求助
解决Python调用PostgreSQL函数无数据插入的问题
我一眼就看出问题出在哪了——psycopg2默认不会自动提交事务!你在pgAdmin里执行函数时,工具会自动帮你提交事务,但用Python代码调用的时候,执行完函数后没有提交操作,导致事务回滚,所以看起来有返回值,但数据根本没写入数据库。
修复步骤:
- 在调用完函数并处理结果后,添加
conn.commit()来显式提交事务 - 或者在建立连接时设置
autocommit=True(适合不需要事务控制的场景,更推荐显式提交的方式)
修改后的Python代码:
import psycopg2 from parse_config import fn_parse_config def run_function(): conn = None try: # read database configuration login_params = fn_parse_config("etl_process.ini", "psycopg_login") # connect to the PostgreSQL database conn = psycopg2.connect(**login_params) # create a cursor object for execution cur = conn.cursor() # call the stored procedure cur.callproc('usp_test') # process the result set row = cur.fetchone() while row is not None: print(row) row = cur.fetchone() # 关键操作:提交事务,确保数据写入数据库 conn.commit() # close the communication with the PostgreSQL database server cur.close() except (Exception, psycopg2.DatabaseError) as error: # 出错时回滚事务,避免脏数据 if conn is not None: conn.rollback() print(error) finally: if conn is not None: conn.close() if __name__ == '__main__': run_function()
补充说明:
PostgreSQL的函数执行插入操作时,会在当前事务上下文里运行。psycopg2的连接默认处于事务模式,所有操作都在一个未提交的事务中,除非你显式调用commit(),否则当连接关闭时,事务会自动回滚,这就是你看不到数据的核心原因。
在异常处理中加入conn.rollback()是个好习惯,这样如果执行过程中出错,可以把已经执行的操作回滚,避免留下脏数据。
内容的提问来源于stack exchange,提问作者Stuart Kirkup
相关产品推荐
相关产品推荐

