【问题标题】:Error binding parameter 0 - probably unsupported type python错误绑定参数 0 - 可能是不支持的类型 python
【发布时间】:2020-08-06 14:33:16
【问题描述】:
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()

我不明白为什么会出现此错误。我试图让用户选择他们想要搜索的内容和值。 (即按“服务”搜索,值“交付”。

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    这里有几个问题。

    1. 您不能对列名使用占位符。它只能用于表达式,并且替换将是来自参数列表的文字值。如果你有一个可变的列名,你需要使用普通的字符串格式;您应该有一个白名单来防止 SQL 注入。
    2. 引号内的占位符不会被替换。
    3. 您的价值观嵌套得太深了。 c.execute() 的第二个参数应该是一个可迭代的,并且每个元素填充一个占位符。 search 是一个元组的列表,然后你在写(search,) 的时候把它放在另一个元组里面。因此,这些值嵌套了 2 层,而不是在元组参数中。
    4. 函数的默认值不应调用input()。默认值是在定义函数时评估的,而不是在调用它时评估的。因此,这将在您加载脚本时询问您的输入,并在每次调用函数时使用这些相同的值作为默认值。
    5. 在执行查询之前调用c.fetchall()
    6. 您缺少for item in items: 循环。
    7. SELECT 查询之后不需要conn.commit(),只需要修改数据库的查询。而且你不应该在这个函数中调用conn.close(),因为它没有打开连接;其他功能可能仍需要使用该连接。
    
    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]}")
    

    此外,无需在 f 字符串中使用 str(),因为格式会自动将值转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多