在没有起搏器的sqlite3(Python)中的Select语句工作正常,但与起搏器(?)的行为却很奇怪
在下面的代码中,当我在选择中使用“ table_column_name”时,我将列表中的所有项目填充到列表框中。但是当我在起搏器的帮助下将其作为选择语句的元组传递时,我的列表bosx只有一个条目,即“ table_column_name”。
class ListObj(tkinter.Listbox):
def __init__(self, window, cname, r, c, rs, cs, sticky, bg,
padx=5, pady=5, ipadx=0, ipady=0, **kwargs):
self = tkinter.Listbox(window)
self.grid(row=r, column=c, rowspan=rs, columnspan=cs,
sticky=sticky, padx=padx, pady=pady,
ipadx=ipadx, ipady=ipady)
List = cursor.execute(f"SELECT DISTINCT ? FROM juke_box",
(cname,))
for x in List:
print(x)
self.insert(tkinter.END, x)
list_box= ListObj(root, 'table_column_name',1,0,2,1,'nsew', 'sky blue')
我的预期结果是,我应该获得传递的列名称中的所有项目,因为元组应该填充在tk列表中。
答案 0 :(得分:0)
List = cursor.execute(f"SELECT DISTINCT ? FROM juke_box",
(cname,))
好像您正在尝试将列名作为绑定参数传递。你不能那样做;编译时,表名和列名必须出现在SQL语句中,而不是在执行时传递。 cname
变量被绑定为一个字符串,并返回该字符串。因为它是SELECT DISTINCT
,并且表的每一行最终都选择相同的'table_column_name'
字符串,所以仅返回具有该值的一行。整个查询基本上可以简化为SELECT ?
,其中问号由cname
中的字符串代替。