Python中DuckDB的SQL查询引用参数/变量的语法问题
在DuckDB的SELECT语句中使用Python变量的正确方法
DuckDB在Python环境中支持几种引用外部变量的方式,以下是最常用的几种方案:
参数化查询(推荐,安全防注入)
使用?作为占位符,在query方法中通过parameters参数传入变量值:y = 2 dk.query("SELECT * FROM DF WHERE x > ?", parameters=[y]).to_df()这种方式是DuckDB官方推荐的参数化方式,能有效避免SQL注入风险,同时适配各种数据类型。
Python格式化字符串(仅适用于可信变量)
如果变量是完全可控、无安全风险的(比如固定值或内部生成的变量),可以用f-string直接拼接SQL语句:y = 2 dk.query(f"SELECT * FROM DF WHERE x > {y}").to_df()注意:如果变量来自用户输入或不可信来源,绝对不要用这种方式,会导致SQL注入漏洞。
注册变量为临时对象
可以把Python变量注册为DuckDB能识别的临时对象,再在SQL中引用:import pandas as pd y = 2 # 将变量注册为临时Series dk.register("y_var", pd.Series([y])) dk.query("SELECT * FROM DF WHERE x > (SELECT * FROM y_var)").to_df()或者通过
SET命令设置DuckDB会话变量:y = 2 dk.execute(f"SET y = {y}") dk.query("SELECT * FROM DF WHERE x > y").to_df()
内容的提问来源于stack exchange,提问作者Kent Culpepper
相关产品推荐
相关产品推荐

