Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2015 22:30:42

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

Приветствую всех форумчан!
Есть проблема: используется довольно длинный 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(). Как решить проблему?

Офлайн

#2 Июнь 18, 2015 23:59:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

QSqlQuery - query.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() проверить.



Отредактировано py.user.next (Июнь 19, 2015 00:00:46)

Офлайн

#3 Июнь 19, 2015 00:20:34

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

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
Что-то не то…

Отредактировано Vady (Июнь 19, 2015 00:21:38)

Офлайн

#4 Июнь 19, 2015 00:50:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

Попробуй ещё перейти на 0 и заменить запрос на более элементарный.



Офлайн

#5 Июнь 19, 2015 01:03:39

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

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

Не пойму что тут даст более элементарный запрос…

Офлайн

#6 Июнь 19, 2015 01:23:40

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

Разобрался, надо было установить:

stacQuery.setForwardOnly(False)
Спасибо за помощь!

Офлайн

#7 Июнь 19, 2015 01:41:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

Vady
Не пойму что тут даст более элементарный запрос…
Прежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.



Офлайн

#8 Июнь 19, 2015 01:50:07

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

py.user.next
Прежде чем исправлять ошибку, нужно определить откуда она происходит. Пока это неизвестно, нужно отсекать те места, где ошибки точно нет. Поэтому нужно использовать такой запрос, о котором известно, что он правильно обрабатывается.
Vady
SQL-запрос на пару сотен строк, обкатанный годами, его предпочитаю не трогать
Этого достаточно?

Офлайн

#9 Июнь 19, 2015 02:57:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

Vady
Этого достаточно?
Не, имеется в виду внутренний парсер у QSqlQuery. К примеру, если там будет ошибка в самом парсере, которая не проявляется на простых запросах, но проявляется на каком-то специфичном запросе, то можно долго искать причину ошибки в совсем другом месте, полагая, что раз это Qt, то в нём ошибок нет.



Офлайн

#10 Июнь 19, 2015 06:49:43

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

QSqlQuery - query.next() дважды

А я вот понять не могу: если вы хотите все занести в массив и в нем обрабатывать, зачем курсор туда-сюда дергать? Прошел раз, скинул в массив, и отпустил курсор. Опять же ForwardOnly курсор для базы дешевле.



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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version