【问题标题】:How to use f-Literal with PartiQL in AWS and boto3如何在 AWS 和 boto3 中使用 f-Literal 和 PartiQL
【发布时间】:2022-06-23 23:03:02
【问题描述】:

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

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

【问题讨论】:

  • 不要使用字符串格式构造 SQL 查询。 execute_statement 几乎肯定支持参数化查询。
  • 您的 immediate 问题是您将用于 define str 文字的双引号包含为 literal characters i> 在新的str 值中。
  • @chepner 它几乎适用于参数化版本,只是不能用它替换表名。有什么提示吗?
  • 我知道psycopg2 提供了一些额外的扩展来安全地构建查询;我不知道dynamodb

标签: python amazon-web-services amazon-dynamodb partiql


【解决方案1】:

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

PK = "c#12345"

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

可以说,您可以通过 f-string 注入表名 Onlineshop,就像在 OP 的原始自我回答中一样,但这只有在表名不是由用户(或其他外部实体)提供的情况下才是安全的。我个人更喜欢看到硬编码的表名。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-08
      • 2020-07-09
      • 2021-08-15
      • 2018-10-09
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多