Подтвердить что ты не робот

Cursor.rowcount всегда -1 в sqlite3 в python3k

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

cursor = newdb.execute('select * from mydb;')
print len(cursor.fetchall())

Fetchall() вернет список строк, возвращаемых из select. Лен этого списка даст вам строку.

Ответ 3

Вместо того, чтобы "проверять, возвращает ли fetchone() что-то отличное от None", я предлагаю:

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

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

Ответ 4

Лучше подсчитать строки таким образом:

 print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0]

Ответ 5

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

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

rowcount={int}
arraysize={int}1

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

print(cursor.arraysize)
1