Форум сайта python.su
0
Приветствую всех форумчан!
Есть проблема: используется довольно длинный 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
Офлайн
857
Note that the query must be in an active state and isSelect() must return true before calling this function.bool QSqlQuery::seek ( int index, bool relative = false )
Отредактировано py.user.next (Июнь 19, 2015 00:00:46)
Офлайн
0
py.user.nextПроверил перед seek:
Note that the query must be in an active state and isSelect() must return true before calling this function.
print(stacQuery.isSelect()) print(stacQuery.isActive())
Отредактировано Vady (Июнь 19, 2015 00:21:38)
Офлайн
857
Попробуй ещё перейти на 0 и заменить запрос на более элементарный.
Офлайн
0
py.user.next
Попробуй ещё перейти на 0 и заменить запрос на более элементарный.
print(stacQuery.at()) stacQuery.seek(0) print(stacQuery.at())
print(stacQuery.at()) stacQuery.seek(pos) print(stacQuery.at())
Офлайн
0
Разобрался, надо было установить:
stacQuery.setForwardOnly(False)
Офлайн
857
VadyПрежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.
Не пойму что тут даст более элементарный запрос…
Офлайн
0
py.user.next
Прежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.
VadyЭтого достаточно?
SQL-запрос на пару сотен строк, обкатанный годами, его предпочитаю не трогать
Офлайн
857
VadyНе, имеется в виду внутренний парсер у QSqlQuery. К примеру, если там будет ошибка в самом парсере, которая не проявляется на простых запросах, но проявляется на каком-то специфичном запросе, то можно долго искать причину ошибки в совсем другом месте, полагая, что раз это Qt, то в нём ошибок нет.
Этого достаточно?
Офлайн
72
А я вот понять не могу: если вы хотите все занести в массив и в нем обрабатывать, зачем курсор туда-сюда дергать? Прошел раз, скинул в массив, и отпустил курсор. Опять же ForwardOnly курсор для базы дешевле.
Офлайн