如何使用"WHERE"和"AND"运算符在 SQLite3 中查询多个参数



我目前正在编写分析交易卡的代码,我将其存储在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.接口错误:绑定参数 0 时出错 - 可能不支持的类型。

这是指行

cur.execute(sql,test(

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

或者,如果这不是问题所在,如何重新格式化它以正确运行?谢谢!

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

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 注入。无需制作自己的元组。

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

作为更新:

我发现错误是由于输入引起的,而不是函数本身。前面的函数,导致它,如下所示:

    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]

感谢那些做出贡献的人!

最新更新