AttributeError: у объекта 'tuple' нет атрибута 'translate'

Я занимаюсь разработкой этой программы и по какой-то причине все время получаю эту ошибку. Это ошибка, вызванная Ubuntu, или что-то в моем коде, что это приводит к сбою моей программы?

Я обращаюсь к базе данных и пытаюсь удалить из вывода следующие символы: и через value.translate(dictionary_of_bad_characters), Вот где я получаю свою ошибку.

def get_data(plu):          # Get the data needed
    global value            # Set the variable value to global

    conn = sqlite3.connect('plus.sqlite')   # Connect to the sqlite3 database

    cursor = conn.cursor()  # Set cursor as the cursor for plus.sqlite

    results = cursor.execute('SELECT value FROM plus WHERE plu=?', [plu])
    # Above code gets the data value for value with the PLU of plu

    value = results.fetchone()            # Get the results of value

    data = [row[0] for row in results.fetchall()]

    translation_table = dict.fromkeys(map(ord, '+-(),'), None)
    # Above code creates a table with the mapped characters

    value = value.translate(translation_table)
    # Above code removes any unnescessary characters from value

    response = {    'PLU':      plu,
                    'Value':    value
                    }       # Create the response variable

    value = int(value)      # Convert value to type integer

    cursor.close()          # Close the cursor
    conn.close()            # Close the connection

    return(value)           # Return to the program flow

1 ответ

Решение

Эта ошибка указывает на то, что value это кортеж, а не строка, как вы могли бы ожидать. Это указывает на проблему с вашим приложением.

Здесь проблема в том, что fetchone() возвращает один кортеж Вы должны изменить из этой строки:

value = results.fetchone()

к этому (обратите внимание на запятую после value):

value, = results.fetchone()

или это (не рекомендуется):

value = results.fetchone()[0]

Но почему fetchone() возвращать кортеж вместо строки? Потому что ты можешь SELECT несколько столбцов. Рассмотрим, например, следующий оператор SQL:

SELECT a, b, c FROM my_table;

В этом случае, fetchone() вернет тройку.

Пишу value, = fetchone() вы говорите Python, что вы ожидаете один кортеж, и вы хотите, чтобы этот единственный элемент был помещен в value, Если бы вы ожидали три кортежа, вы бы использовали column_a, column_b, column_c = resulsts.fetchone(),

Это причина, почему вы должны предпочесть value, над fetchone()[0],


Бонус: я заметил, что вы используете Python 3. В этом случае вы можете написать:

translation_table = dict.fromkeys(b'+-(),', None)

Ускорение вашего кода и сделать его более чистым.

Другие вопросы по тегам