使用参数列表或元组在 pandas 中读取 SQL
Posted
技术标签:
【中文标题】使用参数列表或元组在 pandas 中读取 SQL【英文标题】:Read SQL in pandas with parameter list or tuple 【发布时间】:2020-09-09 18:54:44 【问题描述】:我在使用 WHERE
in 子句在 pandas 中运行 SQL 脚本时遇到问题,该子句选择列表或元组的成员
tuple=(1,2,3,4,5,6, 7) # there are 2228 members
date=20200101
sql=pd.read_sql_query("""SELECT *
FROM [MY_TABLE] with (nolock)
WHERE [cod] IN (?)
and bi_partition>=?""", conn, params=[tuple, date])
返回的错误:
('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The data types varchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)')
当使用 params =[str(tuple), str(date)] 时,错误是:
('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The data types varchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)')
我尝试使用在 *** 上找到的不同解决方案来修复它,但它不起作用。
有人可以帮忙吗?
谢谢
【问题讨论】:
你可以试试params=[str(tuple), str(date)]
吗?
@Aviv Yaniv,我试过但返回不同的错误:('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]数据类型 varchar 和 ntext 不兼容在等于运算符中。(402) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]无法准备语句。(8180)')
@Vero 设置您评论的错误。你也可以编辑你的帖子:)
where [cod] in ?
而不是 (?)
可能会解决它。
不幸的是,没有。它给出了同样的错误
【参考方案1】:
考虑避免在 Python 元组的 IN
子句中使用数千个单独的值。由于值来自不同的查询,请使用来自具有IN
的值源的子查询。
date = "2020-01-01"
sql = """SELECT Col1, Col2, Col3, ...
FROM [MY_TABLE]
WHERE bi_partition >= ?
AND [cod] IN
(SELECT [cod] FROM myOtherTable)"""
df = pd.read_sql_query(sql, conn, params=[date])
此外,考虑明确标识 SELECT
中的列以提高代码的可读性和可维护性,您和代码的读者可以看到实际正在检索哪些字段,并避免拉入不需要的大型列(如 BLOB)或元标识符(如 GUID)用于熊猫分析。见Why is SELECT * considered harmful?
【讨论】:
@Parfait,谢谢你的解决方案!我还没试过。我明白了这个想法。有道理!以上是关于使用参数列表或元组在 pandas 中读取 SQL的主要内容,如果未能解决你的问题,请参考以下文章
Python MySQLdb/mysqlclient:绑定命名集(或元组或列表)作为参数
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用loc基于行层索引元组范围筛选dataframe数据(指定起始元组和结束元组)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用loc基于行层索引元组范围筛选dataframe数据(指定起始元组和结束元组)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用loc基于行层索引元组范围筛选dataframe数据(指定起始元组和结束元组)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于列索引元组列表索引多列数据(index tuple list)
pandas使用read_csv函数读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引loc基于行层索引元组和列层索引元组筛选dataframe数据