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

如何在Python的psycopg2中调用带参数的PostgreSQL函数

用Python调用PostgreSQL的f_update_in_steps函数

步骤1:安装PostgreSQL Python驱动

先安装psycopg2-binary(无需编译环境的预编译版本):

pip install psycopg2-binary

步骤2:编写调用代码

使用psycopg2连接数据库,通过参数化方式调用函数,避免SQL注入风险:

import psycopg2
from psycopg2 import OperationalError

def call_update_function(old_val, new_val):
    # 替换为你的实际数据库连接参数
    conn_params = {
        "host": "你的数据库主机",
        "database": "你的数据库名",
        "user": "数据库用户名",
        "password": "数据库密码",
        "port": "5432"  # PostgreSQL默认端口,按需修改
    }

    conn = None
    try:
        # 建立连接
        conn = psycopg2.connect(**conn_params)
        cur = conn.cursor()

        # 调用目标PostgreSQL函数,传入参数
        cur.callproc('f_update_in_steps', (old_val, new_val))
        
        # 提交事务,确保UPDATE操作生效
        conn.commit()
        print("函数执行完成")

    except OperationalError as e:
        print(f"数据库连接失败: {e}")
        if conn:
            conn.rollback()
    except Exception as e:
        print(f"函数执行出错: {e}")
        if conn:
            conn.rollback()
    finally:
        # 关闭资源
        if conn:
            cur.close()
            conn.close()

# 示例调用:将'apple'替换为'AAPL'
call_update_function('apple', 'AAPL')

关键注意事项

  1. SQL注入风险:你的PostgreSQL函数中使用了字符串拼接构造SQL语句,存在严重的注入漏洞。建议修改函数为参数化查询,比如用EXECUTE ... USING语法:
    PERFORM dblink_exec(
     'UPDATE "EndOfTheDay_change_test"
       SET    symbol = $1
       WHERE  id >= $2
       AND    id < $3
       AND    symbol = $4
       AND    symbol IS DISTINCT FROM $1',
     ARRAY[_newVal, _cur, _cur + _step, _oldVal]);
    
  2. dblink配置:确保dblink_connect('dbconnectionparameters')对应的连接参数已正确配置(比如pg_hba.conf允许访问、连接字符串有效)。
  3. 事务处理:必须调用conn.commit()提交事务,否则UPDATE的修改不会持久化;出错时要执行rollback()回滚,避免脏数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:35:24