如何在 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.
我想使用 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.