Параметр привязки ошибки 0 - вероятно, неподдерживаемый тип python - PullRequest
0 голосов
/ 06 августа 2020
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()

Не понимаю, почему я получаю эту ошибку. Я пытаюсь заставить пользователя выбрать, по чему он хочет искать, и значение. (т.е. поиск по «услуге», значению «доставка».

1 Ответ

0 голосов
/ 06 августа 2020

Здесь есть несколько проблем.

  1. Вы не можете использовать заполнитель для имени столбца. Его можно использовать только для выражений, и заменой будет буквальное значение, полученное из списка параметров. Если у вас есть переменное имя столбца, вам нужно использовать обычное форматирование строки; у вас должен быть белый список для предотвращения внедрения SQL.
  2. Заполнители не заменяются внутри кавычек.
  3. Ваши значения вложены слишком глубоко. Второй аргумент c.execute() должен быть повторяемым, и каждый элемент заполняется одним заполнителем. search - это список кортежа, а затем вы помещаете его в другой кортеж, когда пишете (search,). Таким образом, значения вложены на 2 уровня в глубину, а не в аргументе кортежа.
  4. Значения функции по умолчанию не должны быть вызовами input(). Значения по умолчанию оцениваются при определении функции, а не при ее вызове. Таким образом, при загрузке скрипта у вас будут запрашиваться входные данные, и при каждом вызове функции будут использоваться те же значения по умолчанию.
  5. Вы вызываете c.fetchall() перед выполнением запроса.
  6. Вам не хватает for item in items: l oop.
  7. conn.commit() не требуется после SELECT запросов, только запросы, которые изменяют базу данных. И вы не должны вызывать 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]}")

Кроме того, нет необходимости использовать str() в f-строке, поскольку форматирование автоматически преобразует значения в строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...