【问题标题】:SQL Datetime WHERE clause returning wrong monthSQL Datetime WHERE 子句返回错误的月份
【发布时间】:2021-04-05 11:43:51
【问题描述】:

我正在使用 pyathena 库和以下函数从 AWS Athena 中提取数据:

def import_ben_datalake(ACCESS_KEY, SECRET_KEY, S3_DIR, REGION, start, end):
    conn = pyathena.connect(aws_access_key_id = ACCESS_KEY, 
                            aws_secret_access_key = SECRET_KEY,
                            s3_staging_dir = S3_DIR,
                            region_name = REGION)
    sql = f"""SELECT columns
          FROM table
          WHERE column_datetime BETWEEN PARSE_DATETIME('{start.strftime("%Y-%m-%d")}', 'YYYY-MM-DD')
                                    AND PARSE_DATETIME('{end.strftime("%Y-%m-%d")}', 'YYYY-MM-DD')"""

    df = pd.read_sql(sql, conn)
    conn.close()

    return df

开始和结束参数是datetime.date 变量为:

start_test = datetime.date(2020, 11, 22)
end_test = datetime.date(2020, 11, 28)

两者都是今年 11 月的日期,但当我调用该函数时,它会返回 2020 年 1 月 22 日到 2020 年 1 月 28 日之间的所有值。

任何帮助都可以解决这个问题!

【问题讨论】:

  • 呃,请不要使用字符串格式来构建 SQL 查询。它不仅可能是您的问题的原因,而且它也对 SQL 注入开放。查看参数化查询
  • 亲爱的@roganjosh,感谢您的建议。我不知道如何使用参数化查询!你能给我一个例子来说明我的查询将如何作为参数化查询吗?最好的问候!!
  • 嗯。我刚刚发现 Amazon Athena doesn't support parameterized queries 所以在这种情况下他们似乎无济于事。这对我来说似乎很奇怪
  • 其实它确实支持参数化查询。我会用正确的参数化查询回复我的帖子。

标签: python sql amazon-web-services amazon-athena pyathena


【解决方案1】:

按照解决我的问题的参数化查询示例:

def import_ben_datalake(ACCESS_KEY, SECRET_KEY, S3_DIR, REGION, start, end):
    conn = pyathena.connect(aws_access_key_id = ACCESS_KEY, 
                            aws_secret_access_key = SECRET_KEY,
                            s3_staging_dir = S3_DIR,
                            region_name = REGION)
    sql = """SELECT columns
             FROM table
             WHERE column.datetime BETWEEN %(start)s AND %(end)s"""

   df = pd.read_sql(sql, conn, params = {"start": start, "end": end})
   conn.close()

   return df

【讨论】:

  • 不错的发现。有趣的是,python 绑定绕过了实际缺乏参数化here 的限制,因此它符合PEP 249
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多