Python中如何用f-String在SQLite查询中正确传递参数?
解决SQLite查询中f-String传递字符串参数的问题
你遇到的问题是因为用f-String直接拼接字符串参数时,生成的SQL语句里ACURA没有被引号包裹,SQLite将其识别为列名而非label列的取值,所以抛出了"no such column: ACURA"的错误。
推荐方案:使用参数化查询(安全且无语法问题)
pandas的read_sql支持参数化查询,不需要手动拼接SQL语句,既能解决引号问题,还能避免SQL注入风险,是最优解:
import pandas as pd import sqlite3 def query_brand(filter_val): # 用?作为占位符,通过params传递参数 sql_result = pd.read_sql('SELECT * FROM ps_lss_brands WHERE label = ?', self.conn_brand, params=(filter_val,)) # read_sql返回的已是DataFrame,直接筛选需要的列即可 df = sql_result[['id_brand', 'label']] print(df) query_brand("ACURA")
临时方案:手动添加引号(不推荐,存在SQL注入风险)
如果非要用f-String拼接,需要给参数值加上单引号,确保SQL将其识别为字符串:
import pandas as pd import sqlite3 def query_brand(filter_val): # 注意:该方式存在SQL注入风险,若参数包含单引号会触发语法错误 sql_result = pd.read_sql(f"SELECT * FROM ps_lss_brands WHERE label = '{filter_val}'", self.conn_brand) df = sql_result[['id_brand', 'label']] print(df) query_brand("ACURA")
另外注意:原代码中pd.DataFrame(sql_query, columns=['id_brand', 'label'])是多余的,pd.read_sql执行后直接返回DataFrame,无需再次转换。
内容的提问来源于stack exchange,提问作者Lucin Husein
相关产品推荐
相关产品推荐

