熊猫read_sql与where子句一起使用“ in”

时间:2018-12-18 18:57:03

标签: python sql-server pandas

帮助!

我需要使用“ in”子句查询表,其中的SQL看起来像这样:

kruskal.test(sex$M~ Type, data=df)

我最初是采取一种幼稚的方法并尝试了此方法:

select * from some_table where some_field in (?)

哪个不起作用,它会引发以下错误:

in_items = [1,2,3,4]
df = pd.read_sql(MY_SQL_STATEMENT, con=con, params=[in_items]

我被困在哪里,正在弄清楚如何将项目列表作为单个参数传递。

我可以执行字符串连接方法,例如:

The SQL contains 1 parameter markers, but 4 parameters were supplied

如果可能的话,我宁愿避免这种方法。有人知道将值列表作为单个参数传递的方法吗?

我也愿意采取一种更聪明的方法来做到这一点。 :)

2 个答案:

答案 0 :(得分:1)

使用简单字符串格式的占位符,然后将您的参数传递到pandas.read_sql中。请注意,占位符标记取决于DB-API:pyodbc / sqlite3使用qmarks ?,而其他大多数标记符则使用%s。下面假设以前的标记:

in_items = [1,2,3,4]
MY_SQL = 'select * from tableA where fieldA in ({})'\
           .format(', '.join(['?' for _ in in_items]))
# select * from tableA where fieldA in (?, ?, ?, ?)

df = pd.read_sql(MY_SQL, con=con, params=[in_items])

答案 1 :(得分:0)

对我来说,使用sqllite3可以这样工作:

list_of_entries_to_retrive = pd.read_excel('.table_with_entries.xlsx')
list_of_entries_to_retrive = (cell_list['entries']).tolist()

conn = sqlite3.connect('DataBase.db')

queryString = 'SELECT * FROM table WHERE attribute IN (\'{}\');'.format('\',\''.join([_ for _ in list_of_entries_to_retrive]))
df = pd.read_sql(queryString, con=conn)

不要这样工作:

df = pd.read_sql(queryString, con=conn,  params=[list_of_entries_to_retrive]))

谢谢