在AWS与boto3中用f-Literal结合PartiQL加排序键条件遇NameError求解
在AWS boto3中用PartiQL结合f-string查询DynamoDB时遇到NameError问题
我正在尝试在AWS和boto3中使用f-string结合PartiQL查询DynamoDB,对排序键(sk)设置begins_with条件。以下是我的当前代码:
table_name = 'TableName' pk = "CID-73665" Condition = "begins_with(sk,'CUS#')" # get item stmt = f"SELECT * FROM {table_name} WHERE pk=? and {Condition}" pmt =[{ "S": pk }, { "S": sk }] resp = dynamodb_client.execute_statement( Statement=stmt , Parameters= pmt ) pp.pprint(resp['Items'])
运行时出现如下错误:
NameError: name 'sk' is not defined
问题原因及解决方法
错误根源:你在参数列表
pmt里引用了变量sk,但代码里从未定义过这个变量。而且你的begins_with条件里直接写了常量'CUS#',没有使用占位符?,所以根本不需要给这个条件传参数。修正后的基础版本代码:
table_name = 'TableName' pk = "CID-73665" Condition = "begins_with(sk,'CUS#')" # get item stmt = f"SELECT * FROM {table_name} WHERE pk=? and {Condition}" # 只需要传入pk对应的参数即可 pmt =[{ "S": pk }] resp = dynamodb_client.execute_statement( Statement=stmt , Parameters= pmt ) pp.pprint(resp['Items'])
- 如果需要动态配置前缀的版本:
如果你想让begins_with的前缀变成可动态设置的变量,就需要把条件改成带占位符的形式,同时定义对应的变量并传入参数:
table_name = 'TableName' pk = "CID-73665" sk_prefix = "CUS#" # 用?作为占位符替代硬编码的常量 Condition = "begins_with(sk,?)" # get item stmt = f"SELECT * FROM {table_name} WHERE pk=? and {Condition}" pmt =[{ "S": pk }, { "S": sk_prefix }] resp = dynamodb_client.execute_statement( Statement=stmt , Parameters= pmt ) pp.pprint(resp['Items'])
内容的提问来源于stack exchange,提问作者Hector Devough
相关产品推荐
相关产品推荐

