使用参数列表或元组在 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数据