Найти - Пользователи
Полная версия: QSqlQuery - query.next() дважды
Начало » Python для новичков » QSqlQuery - query.next() дважды
1 2
Vady
Приветствую всех форумчан!
Есть проблема: используется довольно длинный SQL-запрос на пару сотен строк, обкатанный годами, его предпочитаю не трогать. Только на уровне питона решил обрабатывать строки, занеся в отдельный массив.
Код выглядит примерно так:
stacQuery = db.query(stmt)
pos=stacQuery.at()#возвращает "-1"
for st in range(0, stacQuery.size()):
    SR = stacQuery.record() if stacQuery.next() else None
#SR выдает:
#<PyQt4.QtSql.QSqlRecord object at 0x000000000C19FF28>
#<PyQt4.QtSql.QSqlRecord object at 0x000000000C18A358>
#<PyQt4.QtSql.QSqlRecord object at 0x000000000C19FF28>
#<PyQt4.QtSql.QSqlRecord object at 0x000000000C18A358>
stacQuery.seek(pos)#возвращаю к исходной позиции после цикла.
print(stacQuery.at())#возвращает "-1", как и нужно мне, т.е в исходное положение до предварительной обработки.
stacRecord = stacQuery.record() if stacQuery.next() else None
#stacRecord выдает: None
Вопрос: почему, несмотря на то, что поместил указатель при помощи stacQuery.seek(pos) в исходное положение, stacQuery.next() вернул False, хотя первая аналогичная команда вернула другое значение?
Пробовал делать так: SQ = stacQuery, но после манипуляций с SQ, не трогая при этом stacQuery, в конце концов stacQuery.at() принимает значение, аналогичное SQ.at(). Как решить проблему?
py.user.next
bool QSqlQuery::seek ( int index, bool relative = false )
Note that the query must be in an active state and isSelect() must return true before calling this function.

Попробуй isSelect() проверить.
Vady
py.user.next
Note that the query must be in an active state and isSelect() must return true before calling this function.
Проверил перед seek:
        print(stacQuery.isSelect())
        print(stacQuery.isActive())
Результат:
True
True
Что-то не то…
py.user.next
Попробуй ещё перейти на 0 и заменить запрос на более элементарный.
Vady
py.user.next
Попробуй ещё перейти на 0 и заменить запрос на более элементарный.

        print(stacQuery.at())
        stacQuery.seek(0)  
        print(stacQuery.at())
Выдает:
3
3
А при:

        print(stacQuery.at())
        stacQuery.seek(pos)  
        print(stacQuery.at())
3
-1

Не пойму что тут даст более элементарный запрос…
Vady
Разобрался, надо было установить:
stacQuery.setForwardOnly(False)
Спасибо за помощь!
py.user.next
Vady
Не пойму что тут даст более элементарный запрос…
Прежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.
Vady
py.user.next
Прежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.
Vady
SQL-запрос на пару сотен строк, обкатанный годами, его предпочитаю не трогать
Этого достаточно?
py.user.next
Vady
Этого достаточно?
Не, имеется в виду внутренний парсер у QSqlQuery. К примеру, если там будет ошибка в самом парсере, которая не проявляется на простых запросах, но проявляется на каком-то специфичном запросе, то можно долго искать причину ошибки в совсем другом месте, полагая, что раз это Qt, то в нём ошибок нет.
PooH
А я вот понять не могу: если вы хотите все занести в массив и в нем обрабатывать, зачем курсор туда-сюда дергать? Прошел раз, скинул в массив, и отпустил курсор. Опять же ForwardOnly курсор для базы дешевле.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB