Python连接Amazon Redshift时如何将起止日期变量嵌入SQL查询
错误原因
你当前的变量拼接写法不符合Python字符串拼接规则,三引号内的逗号和变量名会被直接识别为SQL文本的一部分,最终生成的SQL里日期位置是字面量", start_date , ",自然不符合Redshift的日期格式要求,触发报错。
推荐解决方案(参数化查询,无SQL注入风险)
你用的text()方法原生支持参数绑定,不需要手动拼接日期变量,写法如下:
start_date = '2019-07-01' end_date = '2021-07-01' # SQL中用:参数名作为占位符,不需要额外加引号 try_sql = """ select * from users where created_at >= :start_date and created_at < :end_date limit 10; """ # 执行查询时通过params参数传入变量字典 try_data = pd.read_sql_query(text(try_sql), engine, params={"start_date": start_date, "end_date": end_date}) try_data.head(3)
可选解决方案(字符串格式化,仅适合调试场景)
如果需要直接拼接字符串,可以用f-string或format方法处理,不要用逗号拼接:
f-string写法(Python 3.6+支持)
start_date = '2019-07-01' end_date = '2021-07-01' try_sql = f""" select * from users where created_at >= '{start_date}' and created_at < '{end_date}' limit 10; """
format写法
start_date = '2019-07-01' end_date = '2021-07-01' try_sql = """ select * from users where created_at >= '{}' and created_at < '{}' limit 10; """.format(start_date, end_date)
注意:字符串格式化方法存在SQL注入风险,仅可在参数完全可控的调试场景使用,生产环境必须用参数化查询方案。
内容的提问来源于stack exchange,提问作者Crubal Chenxi Li
相关产品推荐
相关产品推荐

