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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:52