【问题标题】:Read SQL in pandas with parameter list or tuple使用参数列表或元组在 pandas 中读取 SQL
【发布时间】: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)') 

我尝试使用在 StackOverflow 上找到的不同解决方案来修复它,但它不起作用。

有人可以帮忙吗?

谢谢

【问题讨论】:

  • 你可以试试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 ? 而不是 (?) 可能会解决它。
  • 不幸的是,没有。它给出了同样的错误

标签: python sql pandas


【解决方案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,谢谢你的解决方案!我还没试过。我明白了这个想法。有道理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2018-01-25
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多