使用PartiQL向DynamoDB列表属性追加值时遇语法错误求助
问题
尝试使用PartiQL语法向DynamoDB中的现有列表属性追加值,目标项主键由pk(userId)和sk(happeningId)组成,参数如下:
table_name = test_table userId = "user09hfh47egd53tgd" happeningId = "happ09hdg2536dget7354tdg" contactId = "C0003" decision = "accept"
编写了如下代码,根据decision的值更新accept或cancel列表:
if decision == "accept": stmt = f"UPDATE \"{table_name}\" SET accept = list_append(accept, :'{contactId}') WHERE pk='{userId}' AND sk='{happeningId}'" print(stmt) resp = dynamodb_client.execute_statement( Statement=stmt ) else: stmt = f"UPDATE \"{table_name}\" SET cancel = list_append(cancel, :'{contactId}') WHERE pk='{userId}' AND sk='{happeningId}'" print(stmt) resp = dynamodb_client.execute_statement( Statement=stmt )
生成的最终语句为:
UPDATE "test_table" SET accept = list_append(accept, :'C0003') WHERE pk='user09hfh47egd53tgd' AND sk='happ09hdg2536dget7354tdg'
执行时出现错误:
ClientError: An error occurred (ValidationException) when calling the ExecuteStatement operation: Statement wasn't well formed, can't be processed: Unexpected term
请问哪里操作出错了?
解答
你的代码存在两个核心错误:
PartiQL参数绑定格式错误
你使用了:'{contactId}'的写法,这不符合PartiQL语法规范。参数占位符只需写:参数名,不需要额外加单引号,且参数值必须通过Parameters参数传递,不能直接拼接进SQL语句——这种拼接不仅会触发语法错误,还存在SQL注入风险。list_append参数类型不匹配
list_append函数要求第二个参数是列表类型,但你直接传入了单个字符串值。正确做法是将contactId包裹在列表中,比如[:contactId]。
修正后的代码如下:
params = { ":pk": userId, ":sk": happeningId, ":contactId": contactId } if decision == "accept": stmt = f'UPDATE "{table_name}" SET accept = list_append(accept, [:contactId]) WHERE pk=:pk AND sk=:sk' else: stmt = f'UPDATE "{table_name}" SET cancel = list_append(cancel, [:contactId]) WHERE pk=:pk AND sk=:sk' print(stmt) resp = dynamodb_client.execute_statement(Statement=stmt, Parameters=params)
关键修正说明
- 所有变量(包括主键)统一使用参数绑定,避免直接拼接SQL语句,同时符合PartiQL语法要求。
- 将
contactId放入列表[:contactId]中,满足list_append对参数类型的要求。 - 参数通过
Parameters字典传递给execute_statement方法,而非直接嵌入SQL字符串。
内容的提问来源于stack exchange,提问作者SwiftMiner
相关产品推荐
相关产品推荐

