私はこのプログラムを開発していますが、何らかの理由でこのエラーが発生し続けます。これは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
このエラーは、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)
コードを高速化し、コードをよりクリーンにします。