1

Python で WolframAlpha の API に対する特定のクエリに対して、SQLite を使用して単純なキャッシュを作成しようとしています。問題は、特定のクエリで SQLite INSERT が失敗することです。その理由は本当にわかりません。

http://products.wolframalpha.com/api/explorer.htmlでは、私が実行した 2 つのクエリを正確に実行できます。彼らです:

nutritional information of coke

nutritional information of milk

最初のクエリの INSERT はうまく機能しますが、2 番目のクエリは失敗します。

キャッシュ機能を処理するコードは次のとおりです。

def run_query(input_query):
    input_query = query_stub + input_query
    cursor.execute('SELECT response FROM cache WHERE query=?', (input_query,))
    response = cursor.fetchone()

    if response:
        print " Cache hit on: %s" % (input_query)
        response = response[0]
    else:
        print " Cache miss on: %s" % (input_query)
        query = waeo.CreateQuery(input_query)
        print '1'
        response = waeo.PerformQuery(query)
        print '2'
        cursor.execute('INSERT INTO cache VALUES (?, ?)', (input_query, response,))
        print '3'
        conn.commit()
        print '4'

    output_json = xmltodict.parse(response)
    return jsonify(output_json)

テーブルは次のように定義されます。

cursor.execute('CREATE TABLE cache (query text, response text)')

以下はログの一部です。ご覧のとおり、INSERT は失敗しています。

    * Running on http://0.0.0.0:8080/
    Cache miss on: nutritional information of coke
1
2
3
4
127.0.0.1 - - [20/Sep/2013 17:51:16] "GET /wa?item=coke HTTP/1.1" 200 -
    Cache miss on: nutritional information of milk
1
2
127.0.0.1 - - [20/Sep/2013 17:51:47] "GET /wa?item=milk HTTP/1.1" 500 -
4

1 に答える 1

0

dwxw が提案したとおりに実行したところ、エンコード エラーがあることがわかりました。クエリの 1 つの結果に非 ASCII 文字が含まれていたようです。

8 ビットのバイト文字列を解釈できる text_factory を使用しない限り、8 ビットのバイト文字列を使用しないでください。

私は周りを検索し、次の行を追加するだけでこれが最も簡単に解決されることを発見しました (conn は私の SQLite 接続です):

conn.text_factory = str

ヒントをありがとう、dwxw。どうして自分で考えなかったのかわかりません...

于 2013-09-21T06:17:58.667 に答える