Форум сайта python.su
Пытаемся сделать множественный insert в базу. Если данные не корректны - проблема с индексами, типами и тд., то такие строки нам не нужны.
Получился код представления:
@view_config(route_name="loader", request_method="POST", renderer="json") def _loader(self): # ........ for i, el in enumerate(els): try: # ....... ask = page.xpath(el.ask_xpath) bid = page.xpath(el.bid_xpath) r = DBSession.query(Rate).filter(Rate.date==datetime.date.today()).first() if r: DBSession.delete(r) r = Rate(ask = ask, bid = bid) DBSession.add(rate) except Exception, e: pass finally: self.request.session.flash(i, queue='loader'); return dict(parse_progress=self.request.session.pop_flash('loader'))
Отредактировано dorian (Янв. 8, 2013 18:18:19)
Офлайн
Такое ощущение, что в каждой итерации начинается новая транзакция, т.к. ошибка “ To begin a new transaction with this Session, first issue Session.rollback()” появляется тогда, когда есть незакрытая транзакция и какая-то новая транзакция пытается что-то делать в базе.
Может как-то явно попробовать начать транзакцию и в ней все изменения делать?
Офлайн
После DBSession.rollback() в обработке исключения нужно создать новый объект DBSession.
Но это больше похоже на устранение последствий, а не причин.
После изменения модели нужно делать DBSession.flush(), чтобы обновить состояние модели.
Проверьте состояние DBSession.autoflush. Должно быть True.
И только после обработки всех данных закоммитить транзакцию во внешнем блоке try…except (сейчас у вас в коде его нет).
Офлайн
Lexander
После DBSession.rollback() в обработке исключения нужно создать новый объект DBSession.Но это больше похоже на устранение последствий, а не причин.После изменения модели нужно делать DBSession.flush(), чтобы обновить состояние модели.Проверьте состояние DBSession.autoflush. Должно быть True.И только после обработки всех данных закоммитить транзакцию во внешнем блоке try…except (сейчас у вас в коде его нет).
sankВся печаль в том, что закомитить можно через transaction.commit(), но как и писал выше, это автоматом прекращает выполнение кода.
Такое ощущение, что в каждой итерации начинается новая транзакция, т.к. ошибка “ To begin a new transaction with this Session, first issue Session.rollback()” появляется тогда, когда есть незакрытая транзакция и какая-то новая транзакция пытается что-то делать в базе.Может как-то явно попробовать начать транзакцию и в ней все изменения делать?
Отредактировано dorian (Янв. 9, 2013 15:58:39)
Офлайн
Дык вы явно транзакцию запускать пробовали?
connection = engine.connect() trans = connection.begin() try: r1 = connection.execute(table1.select()) connection.execute(table1.insert(), col1=7, col2='this is some data') trans.commit() except: trans.rollback() raise
Отредактировано sank (Янв. 9, 2013 16:44:55)
Офлайн
sankПри условии включенного автокоммита, если явная транзакция сработает, значит либо баг в Алхимии, либо ошибка в алгоритме.
Дык вы явно транзакцию запускать пробовали?
Офлайн
Плюс я бы проверил connection.info перед каждой операцией.
Офлайн
Офлайн
bismigalisнет
не оно? http://stackoverflow.com/a/575711/1449350
Офлайн
dorian
в общем пришлось проверять каждое значение
Офлайн