Python中如何将pandas的CompanyId列传入SQL语句的IN运算符中
问题原因
你原有写法失败的核心是str(data["CompanyId"])返回的是pandas Series的完整打印内容(包含索引、换行符、省略号等),不是纯ID值的拼接字符串,因此生成的SQL语法完全错误。
实现方案
快速实现(仅适用于无外部用户输入的内部场景)
直接将CompanyId列转为字符串列表后拼接:
# 拼接ID字符串 id_str = ",".join(data["CompanyId"].astype(str)) # 生成查询语句 myquery = f"SELECT * FROM mydb WHERE CompanyId IN ({id_str})" # 执行查询 result = pd.read_sql_query(myquery, conn)
注意:该方法存在SQL注入风险,禁止在有用户输入的生产环境使用。
最佳实践(参数化查询,推荐所有场景使用)
pandas的read_sql_query原生支持参数传递,不需要手动拼接SQL,完全避免注入风险,同时自动适配不同数据类型的格式:
# 把CompanyId转成列表 id_list = data["CompanyId"].tolist() # 生成对应数量的占位符,不同数据库占位符有差异: # MySQL/SQLite 用 %s,PostgreSQL 用 %s 或者 %(name)s,SQL Server 用 ? placeholders = ",".join(["%s"] * len(id_list)) # 生成带占位符的查询语句 myquery = f"SELECT * FROM mydb WHERE CompanyId IN ({placeholders})" # 传入参数执行查询 result = pd.read_sql_query(myquery, conn, params=id_list)
如果你的ID是字符串类型,该方法也不需要手动加引号,参数化会自动处理格式,不需要额外修改代码。
内容的提问来源于stack exchange,提问作者datatech
相关产品推荐
相关产品推荐

