2013-09-20 4 views
1

Я пытаюсь создать простой кеш с использованием SQLite для определенных запросов с API WolframAlpha в Python. Проблема в том, что SQLite INSERT не работает для определенных запросов, и я действительно не знаю, почему.Ошибка вставки SQLite в Python

В http://products.wolframalpha.com/api/explorer.html можно выполнить ровно два запроса, которые я выполнил. К ним относятся:

nutritional information of coke 

и

nutritional information of milk 

Инструкция INSERT для первого запроса отлично работает, но второй не удается.

Вот код, который заботится о функциональности кэширования:

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 - 
+3

Если вы говорите, что 'cursor.execute' терпит неудачу, он должен вызвать исключение, можете ли вы поймать, что видите, что он говорит? – dwxw

ответ

0

Я сделал так, как предложил dwxw и выяснил, что произошла ошибка кодирования. Похоже, что результаты одного из запросов содержат символы, отличные от ASCII.

Вы не должны использовать 8-битные байтовые строки, если вы не используете text_factory, который может интерпретировать 8-битную байтовые строки

Я искал вокруг и нашел, что это было наиболее легко решаются просто добавив следующую строку (сопп мой SQLite соединение):

conn.text_factory = ул

Спасибо за совет, DWX ш. Я не знаю, как я сам не думал об этом ...

Смежные вопросы