cursor.rowcount всегда -1 в sqlite3 в python3k - PullRequest
22 голосов
/ 08 мая 2009

Я пытаюсь получить rowcount из sqlite3 cursor в моей программе Python3k, но я озадачен, поскольку rowcount всегда -1, несмотря на то, что говорят документы Python3 (на самом деле это так противоречиво, должно быть None). Даже после извлечения всех строк rowcount остается на -1. Это ошибка sqlite3? Я уже проверил, есть ли строки в таблице.

Я могу обойти эту проверку, если fetchone() возвращает что-то отличное от None, но я подумал, что этот вопрос было бы неплохо обсудить.

Спасибо.

Ответы [ 5 ]

20 голосов
/ 08 мая 2009

Из документации :

В соответствии с требованиями спецификации API Python DB, атрибут rowcount «-1 в случае не выполняется executeXX () курсор или количество строк последнего операция не определяется интерфейс».

Это включает SELECT заявлений потому что мы не можем определить число строк запрос производится до строки были извлечены.

Это означает, что все SELECT операторы не будут иметь rowcount. Поведение, которое вы наблюдаете, задокументировано.

РЕДАКТИРОВАТЬ: Документация нигде не говорит о том, что rowcount будет будет обновлено после того, как вы сделаете fetchall(), так что просто ошибочно предполагать, что.

14 голосов
/ 17 февраля 2014
cursor = newdb.execute('select * from mydb;')
print len(cursor.fetchall())

Функция fetchall () вернет список строк, возвращаемых из выбора. Лен из этого списка даст вам количество строк.

8 голосов
/ 10 мая 2009

Вместо «проверки, возвращает ли fetchone () что-то отличное от None», я предлагаю:

cursor.execute('SELECT * FROM foobar')
for row in cursor:
   ...

это sqlite -только (не поддерживается в других реализациях API БД), но очень удобно для sqlite -конкретного кода Python ( и полностью документированы, см. http://docs.python.org/library/sqlite3.html).

7 голосов
/ 13 июня 2016

Может лучше посчитать строки следующим образом:

 print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0]
0 голосов
/ 13 января 2017

Используя PYCharm, в режиме отладки, если вы поместите курсор на переменную курсора, появится маленький +, когда вы щелкнете по нему, вы увидите различные свойства вашего объекта.

В моем курсоре 1 элемента я вижу:

rowcount={int}
arraysize={int}1

Итак, в вашем коде просто используйте:

print(cursor.arraysize)
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...