使用lambda boto3中的参数调用Redshift存储过程



我有一个存储过程,我想从我的AWS lambda调用它。参数的值将随着每次调用而变化,这就是为什么不能对其进行硬编码(说明显而易见的情况(。

从boto3文档中,我相信这就是实现它的方法:

response = rs_client.execute_statement(
ClusterIdentifier='my_cluster_name',
Database='my_db_name',
DbUser='my_user'',
Sql='call my_schema.this_is_my_proc()',
Parameters=[{'name': 'in_param', 'value': 'this is the parameter'}],
StatementName='Test of SP call'
)

但我得到了这个错误:

An error occurred (ValidationException) when calling the ExecuteStatement operation: Parameters list contains unused parameters. Unused parameters: [in_param]

我可以用一个硬编码的参数来调用它,这个参数有效,但当然毫无意义(但证明了对proc的调用有效(:

Sql="call my_schema.this_is_my_proc('and this is the parameter')"

为了完整起见,我的存储过程标题如下:

create or replace procedure my_schema.this_is_my_proc(in_param varchar)
as $$
declare
...

是否可以使用boto3从lambda调用带有一个或多个参数的Redshift SP?

编辑-参数参数看起来像这样:

Parameter=[{'name': 'in_param', 'value': a_variable}]

感谢

您给了它一个名为in_param的参数,但没有告诉它该参数的位置。Data API不会查找参数名称并将其与存储过程定义中的名称进行匹配。此功能必须与没有命名参数的其他类型的SQL命令一起使用。这实际上只是一个正在发生的基本字符串替换。

根据文档,您需要在SQL中添加参数占位符。像这样:

Sql='call my_schema.this_is_my_proc(:in_param)',
Parameters=[{'name': 'in_param', 'value': 'this is the parameter'}],

由于您使用Python作为Lambda语言,因此也可以使用psycopg2包而不是boto3包来解决此问题,如下所示:

import psycopg2
import sys
conn = psycopg2.connect(dbname=sys.argv[1], host=sys.argv[2], port=sys.argv[3], user=sys.argv[4], password=sys.argv[5])
cur = conn.cursor()
in_param="myname"
cmd = f"CALL my_procedure_name('{in_param}');"
cur.execute(cmd)
conn.commit()

注意:由于Aws Lambda没有对psycopg2的开箱即用支持,因此仅在python代码中使用import psycopg2是没有帮助的。您还需要将这个psycopg2文件夹和您自己的Python代码文件打包在一个zip文件中,并将该zip文件作为Lambda源代码上传。我从这个位置下载了我的psycopg2二进制文件,用于我的Python 3.7版本。您可以从同一链接下载与python版本兼容的psycopg2文件夹,并将其与自己的python源代码文件捆绑在一起,然后创建所需的zip文件。

最新更新