使用带有python列表的IN构建SQL查询字符串

cho*_*pay 1 python dataframe pandas jupyter

我建立了一个大熊猫感兴趣的值列表.

table1 = pd.read_csv("logswithIPs.csv")
cips = data_dash['ip'].unique().tolist()
print(cips[:10])
['111.111.111.111', '123.123.123.123', '122.122.122.122', '2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5'...'']
Run Code Online (Sandbox Code Playgroud)

现在我有了上面的列表,我想看看这些IP是否存在于我的SQL数据库的表中.

filterIPs = pd.read_sql("select count(*) as count, url from "+table2+" where c_ip in "+cips+" group by url",conn)
Run Code Online (Sandbox Code Playgroud)

具体来说,我的问题在于我的语法c_ip in "+cips+":

TypeError: Can't convert 'list' object to str implicitly
Run Code Online (Sandbox Code Playgroud)

如何在SQL查询中正确包含列表?

***编辑

所以我终于让它工作了,看起来像熊猫不想要一个它想要一个字符串的列表.

所以我 cipTup = tuple(cips).然后在我的查询中我做了..

where c_ip in "+str(cipTup)" 
Run Code Online (Sandbox Code Playgroud)

它起作用了.

我的猜测是,熊猫知道如何将这样的字符串视为列表.

Max*_*axU 5

我将导出/保存data_dash['ip'].unique()为SQL表,以便它可以有效地用于子查询:

pd.DataFrame({'ip':data_dash['ip'].unique()}).to_sql('tmp_ip', conn, if_exists='replace')
Run Code Online (Sandbox Code Playgroud)

现在您可以在SQL DB端使用它:

qry = """
select count(*) as count, url
from tab_name
where c_ip in (select ip from tmp_ip)
group by url
"""

filterIPs = pd.read_sql(qry, conn)
Run Code Online (Sandbox Code Playgroud)