SQLite3查询匹配指定列表值并导入Pandas DataFrame报错解决
问题解决方法
你的核心问题是SQL语句里的字符串ID没有加单引号,导致SQLite把C20这类值当成了列名,而非s_id列的字符串值,所以报错“no such column: C20”。调换IN的位置没用是因为SQL的语法规则就是列名 IN (值列表),反过来写不符合规范。
下面是两种可行的解决办法:
方法1:给ID添加单引号后拼接(简单但需注意特殊字符)
直接给每个ID字符串加上单引号,再拼接成SQL的IN条件:
import pandas as pd import sqlite3 cnx = sqlite3.connect('c:/path/to/data.sqlite') id_list = ['C20','C23','C25','C28','C83'] # 给每个ID包裹单引号 id_sql = ", ".join(f"'{x}'" for x in id_list) df = pd.read_sql_query(f"SELECT * FROM table WHERE s_id IN ({id_sql})", cnx)
注意:如果你的ID里包含单引号(比如C'20),这种方法会导致SQL语法错误,此时更推荐方法2。
方法2:参数化查询(安全规范,推荐)
利用SQLite的参数占位符?,结合pandas的参数传递功能,避免直接拼接SQL字符串,同时彻底解决引号问题和SQL注入风险:
import pandas as pd import sqlite3 cnx = sqlite3.connect('c:/path/to/data.sqlite') id_list = ['C20','C23','C25','C28','C83'] # 生成和ID数量匹配的占位符 placeholders = ", ".join(["?"] * len(id_list)) # 构造带占位符的查询语句 query = f"SELECT * FROM table WHERE s_id IN ({placeholders})" # 传递参数列表执行查询 df = pd.read_sql_query(query, cnx, params=id_list)
内容的提问来源于stack exchange,提问作者Shane S
相关产品推荐
相关产品推荐

