Почему IPython не может возвращать записи с несколькими полями при отправке запроса в sqlite? - PullRequest
1 голос
/ 15 июля 2009

Я пытаюсь написать простой запрос к базе данных sqlite в скрипте Python. Чтобы проверить правильность моих параметров, я попытался выполнить запрос из командной строки ipython. Выглядело это примерно так:

import sqlite3
db = 'G:\path\to\db\file.sqlite'
conn = sqlite3.connect(db)
results = conn.execute('SELECT * FROM studies').fetchall()

почему-то мои результаты вернулись совершенно пустыми. Затем я попробовал другой тестовый запрос:

results = conn.execute('SELECT id FROM studies').fetchall()

Который вернулся правильно. Я подумал, что есть проблема со звездочкой [НЕПРАВИЛЬНО, СМОТРИ ВТОРОЕ ОБНОВЛЕНИЕ ВНИЗУ НИЖЕ], поэтому я попробовал запрос «SELECT * FROM Studies» из командной строки python по умолчанию. И вот, он вернулся правильно. Я попробовал все обычные способы избежать звездочки только для того, чтобы встретить большое количество сообщений об ошибках. Есть ли способ выполнить этот запрос в IPython?


РЕДАКТИРОВАТЬ: Извините, я неправильно предположил, что IronPython и IPython были одинаковыми. Я имел в виду командную строку IPython, а не инфраструктуру IronPython.


EDIT2: Хорошо, оказывается, звездочка работает, как показано в этом успешном запросе:

'SELECT COUNT(*) FROM studies'

Из предложений, размещенных здесь, выясняется, что ошибка связана с попыткой вернуть записи с несколькими полями, т. Е .:

.
'SELECT field1,field2 FROM studies'

, что по-прежнему приводит к возвращению записей. Я изменил название вопроса соответственно.

Ответы [ 4 ]

1 голос
/ 16 июля 2009

Я попробовал все, что вы упомянули в IPython и sqlite без проблем (ipython 0.9.1, python 2.5.2).

Есть ли вероятность, что это какая-то проблема несовпадения версий? Может быть, ваши оболочки ссылаются на разные библиотеки?

Например,

import sqlite3; print sqlite3.version

возвращать одну и ту же вещь из обеих оболочек (т.е. ipython и обычной, в которой работает SQL-запрос)?

Как насчет

conn.execute('select sqlite_version()').fetchall()

Это возвращает то же самое?

1 голос
/ 16 июля 2009

Вы можете попробовать еще отладку:

s = 'SELEECT * from studies'
print s
conn.execute(s).fetchall()

или

s = 'SELECT ' + chr(42) + ' from studies'
conn.execute(s).fetchall()

Вы также можете попробовать:

conn.execute('select count(*) from studies').fetchall()

если это возвращается как [(0,)], тогда происходит что-то действительно странное: -)


Еще несколько вещей, которые вы можете попробовать:

conn.execute('select id from (select * from studies)').fetchall()

или

cur = conn.cursor()
cur.execute('select * from studies').fetchall()
1 голос
/ 16 июля 2009

Это SQL. IronPython не имеет ничего общего с обработкой запроса. Вы используете необычную кодировку символов? (Т.е. не UTF-8 или ASCII)?

Что произойдет, если вы SELECT id,fieldname,fieldname FROM studies (другими словами, имитируете, что делает '*'.)

0 голосов
/ 16 июля 2009

Просто дикая догадка, но, пожалуйста, попробуйте избежать обратной косой черты в пути к файлу базы данных. Другими словами вместо

db = 'G:\path\to\db\file.sqlite'

попробовать

db = 'G:\\path\\to\\db\\file.sqlite'
...