web-dev-qa-db-ja.com

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

このエラーは、valueがタプルであり、予想どおりの文字列ではないことを示しています。これは、アプリケーションに問題があることを示しています。

ここでの問題は、fetchone()が1タプルを返すことです。次の行から変更する必要があります。

value = results.fetchone()

これに(valueの後のコンマに注意してください):

value, = results.fetchone()

またはこれ(推奨されません):

value = results.fetchone()[0]

しかし、なぜfetchone()は文字列ではなくタプルを返すのですか? SELECT複数の列を使用できるためです。たとえば、次のSQLステートメントを検討してください。

SELECT a, b, c FROM my_table;

この場合、fetchone()は3タプルを返します。

value, = fetchone()と書くと、Pythonに1タプルを期待し、その単一のアイテムをvalueに配置することを伝えます。 3タプルを期待している場合は、column_a, column_b, column_c = resulsts.fetchone()を使用しているでしょう。

これが、fetchone()[0]よりもvalue,を優先すべき理由です。


ボーナスヒント: Python 3.を使用していることに気付きました。この場合、次のように記述できます。

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

コードを高速化し、コードをよりクリーンにします。

8