绑定参数0时出错-可能不支持python类型

绑定参数0时出错-可能不支持python类型,python,sqlite,Python,Sqlite,我不明白为什么我会犯这个错误。我试图让用户选择他们想要搜索的内容和值。i、 e按服务、价值交付进行搜索。这里有几个问题 不能将占位符用作列名。它只能用于表达式,替换将是来自参数列表的文本值。如果您有一个变量列名,则需要使用普通字符串格式;您应该有一个白名单来防止SQL注入。 占位符不会在引号中替换。 您的值嵌套得太深了。c.execute的第二个参数应该是一个iterable,每个元素填充一个占位符。搜索是一个元组列表,然后在编写搜索时将其放入另一个元组中,。因此,这些值嵌套在两层深的位置,而不

我不明白为什么我会犯这个错误。我试图让用户选择他们想要搜索的内容和值。i、 e按服务、价值交付进行搜索。

这里有几个问题

不能将占位符用作列名。它只能用于表达式,替换将是来自参数列表的文本值。如果您有一个变量列名,则需要使用普通字符串格式;您应该有一个白名单来防止SQL注入。 占位符不会在引号中替换。 您的值嵌套得太深了。c.execute的第二个参数应该是一个iterable,每个元素填充一个占位符。搜索是一个元组列表,然后在编写搜索时将其放入另一个元组中,。因此,这些值嵌套在两层深的位置,而不是在元组参数中。 函数的默认值不应是对输入的调用。默认值是在定义函数时计算的,而不是在调用函数时计算的。因此,在加载脚本时,这将要求您输入,并在每次调用函数时使用这些相同的值作为默认值。 在执行查询之前调用c.fetchall。 您缺少items:循环中的for项。 SELECT查询之后不需要conn.commit,只需要修改数据库的查询。您不应该在此函数中调用conn.close,因为它没有打开连接;其他功能可能仍需要使用该连接。 此外,不需要在f字符串中使用str,因为格式化会自动将值转换为字符串

def get_info(search_by=input("Search by: "), value=input("Value: ")):
    search = [
        (f"{str(search_by)}", f"{str(value)}")
    ]
    items = c.fetchall()
    c.execute("SELECT * FROM credentials WHERE (?) LIKE '(?)'", (search,))

   
        print(f"{item[0]}", f"{item[1]}", f"{item[2]}", f"{item[3]}")
    conn.commit()
    conn.close()

get_info()

def get_info(search_by=None, value=None):
    valid_search_by = ['col1', 'col2', 'col3']

    if search_by is None:
        search_by = input("Search by: ")
    if search_by not in valid_search_by:
        raise ValueErr("Invalid search_by")

    if value is None:
        value = input("Value: ")

    c.execute(f"SELECT * FROM credentials WHERE {search_by} LIKE ?", (value,))
    items = c.fetchall()
    for item in items:
        print(f"{item[0]}", f"{item[1]}", f"{item[2]}", f"{item[3]}")