Непоследовательное поведение при использовании sqlite3.Row для индексации результатов по имени - PullRequest
3 голосов
/ 27 сентября 2010

В моем приложении Python я использовал sqlite3.Row в качестве фабрики строк, чтобы индексировать результаты по имени некоторое время без проблем.Недавно я переместил свое приложение на новый сервер (без изменений кода) и обнаружил, что этот метод индексации теперь неожиданно завершается сбоем на новом сервере, учитывая довольно специфические условия.Я не вижу никакого объяснения этому.

Проблема возникает на новом сервере, когда в моем запросе выбора есть ключевое слово DISTINCT:

import sqlite3
conn = sqlite3.connect(':memory:')
conn.row_factory = sqlite3.Row
c = conn.cursor()

c.execute('create table test ([name] text)')
c.execute("insert into test values ('testing')")
conn.commit()

c.execute('select [name] from test')
row = c.fetchone()
print row['name'] # works fine on both machines

c.execute('select distinct [name] from test') # add distinct keyword
row = c.fetchone()
print row['name'] # fails on new server (no item with that key)

Как видите, яЯ могу решить эту проблему, используя базу данных в памяти, поэтому проблема не имеет ничего общего с моими существующими данными.Обе машины основаны на Debian (старая: Ubuntu 8.10, новая: Debian 5.0.3), и обе машины работают на Python 2.5.2.Я полагаю, что модуль sqlite3 является основной частью установки Python, поэтому я не знаю, как может происходить этот тонкий разрыв, поскольку версии Python идентичны.раньше?

Спасибо,
Крис

Ответы [ 2 ]

1 голос
/ 09 октября 2010

Попробуйте добавить строку

print row.keys()

вместо "print row ['name']", чтобы увидеть, какое фактическое имя столбца 0 находится во втором случае (вероятно, оно изменяется ключевым словом "DISTINCT")

В качестве альтернативы вы можете использовать строку [0] в этом случае, но это, скорее всего, не то, что вы хотите. :)

0 голосов
/ 05 июня 2019

У меня была другая, но похожая проблема, но поиск в Google "indexerror no item with the key" привел меня к этому вопросу.В моем случае проблема заключалась в том, что разные версии sqlite по-разному обрабатывают имена ключей строк в режиме row_factory = sqlite3.Row.В sqlite 3.24.0 такой запрос, как:

select table.col
from table

... создает ключ в словаре строк, например col.Но в более старых версиях используется квалифицированный ключ, например table.col.Предоставление явного псевдонима или отсутствие квалификации столбца - это обходной путь.Например:

select table.col as "col"
from table

Или:

select col
from table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...