【问题标题】:Pandas read_sql_query using multiple AND statementsPandas read_sql_query 使用多个 AND 语句
【发布时间】:2018-03-01 11:56:47
【问题描述】:

我正在尝试在 python pandas 中组合一个 SQL 查询。我尝试了不同的方法,但总是收到以下错误: Incorrect number of bindings supplied. The current statement uses 6, and there are 3 supplied.

我的代码如下。我做错了什么?

conn = sqlite3.connect(my_db)
df = pd.read_sql_query(
    con = conn,
    sql = """SELECT * FROM {table}
        WHERE @var1 = (?)
        AND @var2 = (?)
        AND @var3 = (?)
        ;""".format(table=table),
    params= (value1, value2, value3),
    )

【问题讨论】:

  • 你为什么使用@var1而不是实际的列名?
  • @DeepSpace 我假设 OP 每次都想要不同的列。
  • @DeepSpace 我的列名以@开头。 '@var1' 是列名

标签: python sql pandas


【解决方案1】:

正如你所说,@var1@var2@var3 都是列名。

但是,SQL 将 @ 符号解释为您稍后将在代码中提供的值的参数。

因此,由于三个 (?)s 和三个 @vars,您的 SQL 代码需要 6 个值。但是您只提供了 3 个值(对于 (?)s),这意味着正在发生上述错误。

我建议您将列命名为不带 '@' 的名称,以减少出错的机会。

请参阅this question 以获得进一步说明。

【讨论】:

    【解决方案2】:

    sqlite@ 符号(如?)解释为a parameter placeholder(搜索“参数”)。如果@var1 是列的名称,则必须通过用反引号将其包围来进行转义:

    df = pd.read_sql_query(
        con = conn,
        sql = """SELECT * FROM {table}
            WHERE `@var1` = (?)
            AND `@var2` = (?)
            AND `@var3` = (?)""".format(table=table),
        params= (value1, value2, value3), )
    

    agree with @AdiC,不过,rename your columns 会更方便,这样他们就不会使用具有特殊含义的字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多