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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:45:39