web-dev-qa-db-fra.com

AttributeError: l'objet 'Tuple' n'a pas d'attribut 'translate'

Je développe ce programme et pour une raison quelconque, je continue à recevoir cette erreur. Est-ce une erreur causée par Ubuntu ou quelque chose dans mon code qui bloque mon programme?

J'accède à une base de données et j'essaie de supprimer les caractères suivants de la sortie: et, via value.translate(dictionary_of_bad_characters). C'est là que j'obtiens mon erreur.

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
6
RPiAwesomeness

Cette erreur indique que valueest un tuple et non une chaîne comme prévu. Cela indique un problème avec votre application.

Ici le problème est que fetchone() renvoie un one -uple. Vous devriez changer de cette ligne:

value = results.fetchone()

à ceci (notez la virgule après valuename__):

value, = results.fetchone()

ou ceci (non recommandé):

value = results.fetchone()[0]

Mais pourquoi fetchone() renvoie-t-il un tuple à la place d'une chaîne? Parce que vous pouvez SELECTplusieurs colonnes. Considérons par exemple l'instruction SQL suivante:

SELECT a, b, c FROM my_table;

Dans ce cas, fetchone() renverra un trois -uple.

En écrivant value, = fetchone(), vous dites à Python que vous attendez un one-Tuple et que vous voulez que cet élément unique soit placé dans valuename__. Si vous attendiez le triple-tuplet, vous auriez utilisé column_a, column_b, column_c = resulsts.fetchone().

C’est la raison pour laquelle vous devriez préférer value, à fetchone()[0].


Bonus tip: J'ai remarqué que vous utilisiez Python 3. Dans ce cas, vous pouvez écrire:

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

Accélérer votre code et le rendre plus propre.

8