Python实现ClickHouse动态WHERE子句查询时遇问题求助
解决ClickHouse参数化查询的问题
原代码有两个关键问题导致无法运行:
start_date = '2022-07-31',末尾多了个逗号,让这个变量变成了元组类型,而非字符串,传递给查询时会出错- 直接用
{start_date}这种字符串插值的方式不符合clickhouse_driver的参数绑定规范,不仅易引发SQL注入,语法上也不被支持
下面是修正后的代码,使用clickhouse_driver原生的参数绑定方式:
from clickhouse_driver import Client import pandas as pd import numpy as np client = Client('localhost', settings={'use_numpy': True}) # 去掉末尾逗号,确保是字符串类型 start_date = '2022-07-31' end_date = '2022-08-31' # 使用命名参数绑定,查询语句中用%(参数名)s占位 df = client.query_dataframe( 'SELECT * FROM mytable WHERE Date >= %(start_date)s AND Date <= %(end_date)s', params={'start_date': start_date, 'end_date': end_date} )
也可以用位置参数的方式:
df = client.query_dataframe( 'SELECT * FROM mytable WHERE Date >= %s AND Date <= %s', params=[start_date, end_date] )
这两种方式都会自动处理参数的类型转换和转义,既安全又能保证查询正常执行。
内容的提问来源于stack exchange,提问作者moheikal
相关产品推荐
相关产品推荐

