Pandas read_sql 带有使用“in”的 where 子句

Oji*_*ngo 6 python sql-server sqlalchemy pandas

我需要使用“in”子句查询表,其中 SQL 如下所示:

select * from some_table where some_field in (?)
Run Code Online (Sandbox Code Playgroud)

我最初采取了一种天真的方法并尝试了以下方法:

in_items = [1,2,3,4]
df = pd.read_sql(MY_SQL_STATEMENT, con=con, params=[in_items]
Run Code Online (Sandbox Code Playgroud)

这不起作用,它抛出以下错误:

The SQL contains 1 parameter markers, but 4 parameters were supplied
Run Code Online (Sandbox Code Playgroud)

我陷入困境的是弄清楚如何将项目列表作为单个参数传递。

我可以采用字符串连接方法,例如:

MY_SQL = 'select * from tableA where fieldA in ({})'.format(
  ','.join([str(x) from x in list_items]))
df = pd.read_sql(MY_SQL, con=con)
Run Code Online (Sandbox Code Playgroud)

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

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

Par*_*ait 8

只需将占位符格式化为字符串,然后将参数传递到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])
Run Code Online (Sandbox Code Playgroud)