【问题标题】:How to query multiple parameters in SQLite3 using the "WHERE" and "AND" operators如何使用“WHERE”和“AND”运算符在 SQLite3 中查询多个参数
【发布时间】:2019-03-30 20:36:10
【问题描述】:

我目前正在编写代码来分析交易卡,我将其存储在 SQLite 数据库中。下面列出了查询数据库以获取特定卡片的函数之一:

    def colors_search(conn,deck_color,card_ID):
        """
        Query all rows in the colors table
        :param conn: the Connection object
        :return:
        """
        color = (deck_color,)
        test = (color,card_ID)
        sql = ''' SELECT Number
                  FROM Colors
                  WHERE Color=?
                  AND Card_ID=?'''

        cur = conn.cursor()
        cur.execute(sql,test)

        number = cur.fetchall()

        return number

当我尝试运行此函数时,我不断收到以下错误:

sqlite3.InterfaceError:错误绑定参数 0 - 可能是不受支持的类型。

这里指的是行

cur.execute(sql,test)

我觉得错误来自我尝试查询两个变量的方式,但我不确定。如果这是问题所在,我将如何格式化“sql”变量以接收两个参数? Deck_color 和 card_ID 变量是 分别是一个字符串和整数,并且在我的程序中会有所不同,所以我不能对其中任何一个进行硬编码。

或者,如果这不是问题,我该如何重新格式化它才能正常运行?谢谢!

【问题讨论】:

  • 不,它来自test,您需要打印。我怀疑color 是来自先前查询的元组
  • 等等,你实际上把它变成了一个元组。摆脱color = (deck_color,)。它没有任何目的。这就是为什么查询失败并使其成为元组的原因,据我所知,除了导致此错误之外,它不会做任何事情。您的查询已经防止 SQL 注入。

标签: python database sqlite


【解决方案1】:

您的查询没有问题。问题就在这里:

color = (deck_color,)

没有必要创建这个元组。而是:

def colors_search(conn,deck_color,card_ID):
        """
        Query all rows in the colors table
        :param conn: the Connection object
        :return:
        """
        test = (deck_color,card_ID)
        sql = ''' SELECT Number
                  FROM Colors
                  WHERE Color=?
                  AND Card_ID=?'''

        cur = conn.cursor()
        cur.execute(sql,test)

        number = cur.fetchall()

        return number

由于您使用的是?,因此这些值已经转义以防止 SQL 注入。无需制作自己的元组。

【讨论】:

    【解决方案2】:

    你可以尝试使用cur.execute(sql,(deck_color,card_ID)), 或cur.execute(sql,[deck_color,card_ID])

    【讨论】:

      【解决方案3】:

      作为更新:

      我发现错误是由输入引起的,而不是函数本身。前面的函数,它导致它看起来像这样:

          def cards_search(conn,cardname):
              """
              Query all rows in the tasks table
              :param conn: the Connection object
              :return:
              """
              name = (cardname,)
              sql = ''' SELECT Card_ID
                        FROM Cards
                        WHERE Name=?'''
      
              cur = conn.cursor()
              cur.execute(sql,name)
      
              card_ID = cur.fetchall()
      
              return card_ID
      

      这导致 card_ID 是一个列表,这意味着它不是我之前认为的数据类型。我通过将 return 语句更改为如下所示来解决此问题:

          return card_ID[0]
      

      我现在正在运行的新功能如下图所示:

          def colors_search(conn,deck_color,card_ID):
              """
              Query all rows in the colors table
              :param conn: the Connection object
              :return:
              """
              test = (deck_color,card_ID)
              sql = ''' SELECT Number
                        FROM Colors
                        WHERE Color=?
                        AND Card_ID=?'''
      
              cur = conn.cursor()
              cur.execute(sql,test)
      
              number = cur.fetchall()
      
              return number[0]
      

      感谢那些做出贡献的人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-10
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 2021-12-25
        相关资源
        最近更新 更多