如何在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')
关键注意事项
- 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]); - dblink配置:确保
dblink_connect('dbconnectionparameters')对应的连接参数已正确配置(比如pg_hba.conf允许访问、连接字符串有效)。 - 事务处理:必须调用
conn.commit()提交事务,否则UPDATE的修改不会持久化;出错时要执行rollback()回滚,避免脏数据。
内容的提问来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

