Как запросить несколько параметров в SQLite3 с помощью операторов «ГДЕ» и «И» - PullRequest
0 голосов
/ 30 марта 2019

В настоящее время я работаю над кодом для анализа торговых карт, который храню в базе данных 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.InterfaceError: Ошибка привязки параметра 0 - возможно, неподдерживаемый тип.

Это относится к строке

cur.execute (SQL, тест)

Мне кажется, что ошибка возникает из-за того, что я пытаюсь запросить две переменные, но я не уверен. Если это проблема, как мне отформатировать переменную 'sql', чтобы она принимала два параметра? Переменные deck_color и card_ID являются строка и целое число, соответственно, и будут меняться в моей программе, поэтому я не могу жестко написать ни один из них.

С другой стороны, если это не проблема, как я могу переформатировать это для правильной работы? Спасибо!

Ответы [ 3 ]

1 голос
/ 30 марта 2019

В вашем запросе нет ничего плохого.Проблема здесь:

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.Не нужно создавать собственные кортежи.

0 голосов
/ 30 марта 2019

В качестве обновления:

Я обнаружил, что ошибка возникла из-за ввода, а не самой функции.Предыдущая функция, которая привела к этому, выглядела так:

    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]

Спасибо за тех, кто внес свой вклад!

0 голосов
/ 30 марта 2019

Можете ли вы попробовать использовать cur.execute(sql,(deck_color,card_ID)) или cur.execute(sql,[deck_color,card_ID])

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