sqlite: вызов базы данных каждый раз, когда вызывается функция - PullRequest
0 голосов
/ 24 января 2020

Я получил функцию, которая вызывается для вычисления ответа каждый раз, когда пользователь вводит что-то. Функция получает ответ из базы данных. Что я не понимаю, так это то, почему я должен переопределить мою переменную (я назвал ее intets_db), которая содержит все данные из базы данных каждый раз, когда вызывается функция? Я попытался поместить его вне функции, но тогда моя программа работает только в первый раз, но возвращает пустой ответ во второй раз, когда пользователь что-то вводит.

def response(sentence, user_id='1'):
    results = classify_intent(sentence)

    intents_db = c.execute("SELECT row_num, responses, tag, responses, intent_type, response_type, context_set,\
                                    context_filter FROM intents")

    if results:
        # loop as long as there are matches to process
        while results:

            if results[0][1] > answer_threshold:
                for i in intents_db:
                    # print('tag:', i[2])
                    if i[2] == results[0][0]:
                        print(i[6])
                        if i[6] != 'N/A': 
                            if show_details:
                                print('context: ', i[6]) 
                            context[user_id] = i[6] 
                            responses = i[1].split('&/&')
                            print(random.choice(responses))

                        if i[7] == 'N/A' in i or \
                                (user_id in context and i[7] in i and i[7] == context[
                                    user_id]):
                            # a random response from the intent
                            responses = i[1].split('&/&')
                            print(random.choice(responses))

                        print(i[4], i[5])
                print(results[0][1])
            elif results[0][1] <= answer_threshold:
                print(results[0][1])
                for i in intents_db:
                    if i[2] == 'unknown':
                        # a random response from the intent
                        responses = i[1].split('&/&')
                        print(random.choice(responses))
                        initial_comm_output = random.choice(responses)
                        return initial_comm_output
            else:
                initial_comm_output = "Something unexpected happened when calculating response. Please restart me"
                return initial_comm_output
            results.pop(0)

    return results

Кроме того, я начал входить в базы данных и sqlite3, потому что я хочу сделать массивную базу данных в долгосрочной перспективе. Поэтому также кажется неэффективным, что мне приходится загружать всю базу данных вообще. Есть ли какой-то способ, которым я могу загрузить только тот ряд данных, который мне нужен? Я получил столбец row_number в моей базе данных, так что, если бы можно было как-то сказать: «ВЫБЕРИТЕ, ГДЕ row_num = 2 ОТ намерений», это было бы здорово, но я не могу понять, как это сделать.

Ответы [ 2 ]

1 голос
/ 24 января 2020

cursor.execute() возвращает итератор, и вы можете только l oop над ним один раз.

Если вы хотите использовать его повторно, включите его в список:

intents_db = list(c.execute("..."))
0 голосов
/ 25 января 2020

Поэтому также кажется неэффективным, что мне приходится загружать всю базу данных вообще. Есть ли какой-то способ, которым я могу загрузить только тот ряд данных, который мне нужен? Я получил столбец row_number в моей базе данных, так что, если бы можно было как-то сказать: «ВЫБЕРИТЕ, ГДЕ row_num = 2 ОТ намерений», это было бы здорово, но я не могу понять, как это сделать.

Вы почти поняли: это

intents_db = c.execute("SELECT row_num, responses, tag, responses, intent_type,
                            response_type, context_set, context_filter
                        FROM intents WHERE row_num=2")

Но не делайте ошибку, которую допускают другие новички в базе данных, и попробуйте вставить некоторую переменную из вашей программы прямо в эту строку. Это делает программу склонной к SQL инъекциям.

Скорее, выполните

row_num = 2
intents_db = c.execute("SELECT row_num, responses, tag, responses, intent_type,
                            response_type, context_set, context_filter
                        FROM intents WHERE row_num=?", (row_num,))

Конечно, вы также можете установить условия для других полей.

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