GridDB CE v5.0 Python客户端时间范围参数化查询问题咨询
GridDB Python客户端参数化查询问题解答
问题原因
GridDB CE v5.0的Python客户端不支持使用?作为参数占位符,这是导致你遇到[105002] syntax error near '?'错误的直接原因。
解决方案
方法1:使用官方参数绑定API(推荐)
GridDB Python客户端提供了set_parameters方法实现安全参数绑定,需在TQL语句中用$1、$2这类位置占位符,再按顺序传入对应参数:
start_ts = griddb.Timestamp(2025, 7, 15, 0, 0) end_ts = griddb.Timestamp(2025, 7, 15, 6, 0) # 用$1、$2作为位置占位符编写TQL query = container.query( "SELECT * WHERE device_id = 'sensor-1' AND timestamp >= $1 AND timestamp <= $2" ) # 按占位符顺序传入参数 query.set_parameters([start_ts, end_ts]) rowset = query.fetch()
这种方式能彻底避免SQL注入风险,是官方推荐的安全查询方式。
方法2:安全格式化时间戳为字符串
GridDB的TIMESTAMP类型支持解析'YYYY-MM-DD HH:MM:SS'格式的字符串,你可以将griddb.Timestamp对象转换为该格式后嵌入TQL语句:
start_ts = griddb.Timestamp(2025, 7, 15, 0, 0) end_ts = griddb.Timestamp(2025, 7, 15, 6, 0) # 转换为标准时间字符串格式 start_str = f"{start_ts.year}-{start_ts.month:02d}-{start_ts.day:02d} {start_ts.hour:02d}:{start_ts.minute:02d}:{start_ts.second:02d}" end_str = f"{end_ts.year}-{end_ts.month:02d}-{end_ts.day:02d} {end_ts.hour:02d}:{end_ts.minute:02d}:{end_ts.second:02d}" # 构造TQL语句 query = container.query(f"SELECT * WHERE device_id = 'sensor-1' AND timestamp >= '{start_str}' AND timestamp <= '{end_str}'") rowset = query.fetch()
注意:如果device_id是动态变量,禁止直接拼接字符串,必须改用方法1的参数绑定防止SQL注入。
内容的提问来源于stack exchange,提问作者VIK
相关产品推荐
相关产品推荐

