如何在 AWS 和 boto3 中将 f-Literal 与 PartiQL 一起使用

How to use f-Literal with PartiQL in AWS and boto3

我想使用 PartiQL 通过 boto3 查询 DynamoDB table。 当我这样使用它时,我工作得很好:

stmt = "SELECT * FROM Onlineshop WHERE PK= 'c#12345'"
resp = dynamodb.execute_statement(Statement= stmt)

但是当我用 f-literal 替换 select 语句中的一些值时,它失败了。

PK = 'c#12345'
table_name = 'Onlineshop'
stmt = f' "SELECT * FROM {table_name} WHERE PK= {PK}" '
resp = dynamodb.execute_statement(Statement= stmt)

可能是什么原因?

提前致谢

W

好吧,我知道它是如何工作的。这里是任何想在 dynamodb 上使用这种查询的人的解决方案:

PKey = 'c#12345'
table_name = 'Onlineshop'
stmt = f"SELECT * FROM {table_name} WHERE PK= '{PKey}' "
resp = dynamodb.execute_statement(Statement= stmt)

接受的答案存在潜在的 SQL 注入问题,因此我添加了这个替代答案。您应该始终安全地传递参数。

PK = "c#12345"

resp = dynamodb.execute_statement(
    Statement="SELECT * FROM Onlineshop WHERE PK=?",
    Parameters=[
        {
            "S": PK
        }
    ]
)

可以说,您可以通过 f-string 注入 table 名称 Onlineshop,就像在 OP 的原始 self-answer 中一样,但这只有在 table 用户(或其他外部实体)未提供名称。我个人更愿意看到 table 名称 hard-coded.