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

使用f-string向PartiQL函数插入变量失败,该如何解决?

问题:Python f-string插入PartiQL语句时begins_with内的变量失效

我尝试用Python f-string把变量插入PartiQL语句,遇到了问题:

以下语句可以正常运行:

IndexName = 'GSI_1'    
stmt = f"SELECT * FROM {table_name}.{IndexName} WHERE SK=? AND begins_with(PK, 'READ#')"

但下面的语句无法正常工作:

IndexName = 'GSI_1'     
Prefix = 'READ#'

stmt = f"SELECT * FROM {table_name}.{IndexName} WHERE SK=? AND begins_with(PK, {Prefix})"

变量GSI_1能正常生效,但Prefix因为在PartiQL函数begins_with的括号内无法正常工作,请问是否需要对第二个变量进行转义?


解决方法

问题不是转义,是PartiQL要求字符串字面量必须用单引号包裹:你用f-string替换{Prefix}后,生成的语句会变成begins_with(PK, READ#)——这里的READ#没有单引号,PartiQL会把它当成标识符而非字符串,因此报错。

方法1:在f-string中给变量添加单引号

直接在f-string里给{Prefix}套上单引号,让替换后的字符串符合PartiQL语法:

stmt = f"SELECT * FROM {table_name}.{IndexName} WHERE SK=? AND begins_with(PK, '{Prefix}')"

生成的语句会和你之前硬编码的写法一致:begins_with(PK, 'READ#')。

方法2:使用参数绑定(更安全)

如果Prefix是用户输入或动态内容,直接用f-string拼接存在注入风险,推荐用PartiQL的参数占位符?,把Prefix作为执行参数传入:

stmt = f"SELECT * FROM {table_name}.{IndexName} WHERE SK=? AND begins_with(PK, ?)"
# 以boto3执行为例
response = client.execute_statement(
    Statement=stmt,
    Parameters=[{'S': sk_value}, {'S': Prefix}]
)

这种方式不需要手动处理引号,还能避免注入问题,是更规范的写法。

内容的提问来源于stack exchange,提问作者aerioeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:17:21