我目前正在编写分析交易卡的代码,我将其存储在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]
感谢那些做出贡献的人!