Проблема с базовым доступом к базе данных SQLite в Python - PullRequest
2 голосов
/ 14 февраля 2011

У меня есть база данных с именем default.db, и это рабочая база данных [я могу получить к ней доступ через утилиты SQLite и посмотреть таблицы внутри].

У меня есть этот код для доступа к базе данных:

from pysqlite2 import dbapi2 as sqlite

conn = sqlite.connect("default.db")
cur = conn.cursor()

#retrieve all database data

cur.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;")
print "fetch all"
cur.fetchall()

print "printing"
print cur
print conn
for i in cur:
    print "item"
    print i

Вывод:

fetch all
printing
<pysqlite2.dbapi2.Cursor object at 0xb74a2de0>
<pysqlite2.dbapi2.Connection object at 0xb74713d8>
done

Но если я запускаю команды по отдельности, я получаю этот результат изкод:

>>> cur.fetchall()
[(u'cards',), (u'data_for_fact',), (u'fact_views',), (u'fact_views_for_card_type',), (u'facts',), (u'global_variables',), (u'log',), (u'sqlite_sequence',), (u'tags',), (u'tags_for_card',)]

Мой вопрос: как я могу это исправить и что происходит не так?Я не получаю никаких ошибок при подключении к БД [он не сообщает о каких-либо].

edit: я пытался сохранить fetchall в переменную, но переменная печатается как [].(Empty)

Ответы [ 4 ]

2 голосов
/ 14 февраля 2011

Я думаю, вам следует перебрать cur.fetchall(), а не cur -> сам курсор.

Это должно быть похоже на

for i in cur.fetchall():
    print "item"
    print i

И вы также должны удалить предыдущее1008 * команда.

1 голос
/ 14 февраля 2011

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

1 голос
/ 14 февраля 2011

Вероятно, вам следует прочитать документы DBAPI .Но в основном курсор сам по себе не повторяется.Методы, такие как fetchall, возвращают списки, как показывает ваш последний пример.Ваш первый пример возвращает список, но отбрасывается (не назначается).

Из этого документа fetchall делает:последовательность последовательностей (например, список кортежей).Обратите внимание, что атрибут arraysize курсора может повлиять на выполнение этой операции.

0 голосов
/ 14 февраля 2011

cur.fetchall() возвращает все строки, но вы не сохраняете их в переменной.Измените на print cur.fetchall() и оставьте все после него в вашем скрипте, или закомментируйте fetchall, и итератор будет работать:

Пример

import sqlite3
db = sqlite3.connect(':memory:')
cur = db.cursor()
cur.execute('create table  a(a,b,c,d)')
cur.execute('insert into a values(1,2,3,4)')
cur.execute('insert into a values(2,3,4,5)')
cur.execute('insert into a values(3,4,5,6)')
cur.execute('insert into a values(4,5,6,7)')
cur.execute('select * from a')
for i in cur:
    print i

Выход

(1, 2, 3, 4)
(2, 3, 4, 5)
(3, 4, 5, 6)
(4, 5, 6, 7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...