2016-11-29 5 views
0

Я использую sqlalchemy для orm в моем проекте. Моя проблема в том, что каждый раз, когда я использую session.refresh (obj), используется новое соединение db, которое сохраняется до вызова session.close(). Итак, когда я хочу обновить несколько объектов, у меня быстро закончились соединения.SQLAlchemy session.refresh() создает новые соединения

производитель Сессия:

session = session_maker() 
try: 
    yield session 
    session.commit() 
    for obj in session: 
     session.refresh(obj) 
except Exception as e: 
    session.rollback() 
    raise e 
finally: 
    session.close() 

Использование:

with make_session(...) as session: 
     for mapped in [self._mapper.map(obj) for obj in objects]: 
      saved_entities.append(mapped) 
      session.add(mapped) 
     session.flush() 

Я использую обновления, потому что у меня есть столбцы, которые заполняются на обновление, и я хочу, чтобы вернуть текущие значения.

Любопытно, что, когда я это сделать:

for obj in session: 
    session.commit() 
    session.refresh(obj) 

используются только два соединения (это хорошо), но объекты не имеют никаких данных.

+0

Я также пробовал 'session.connection(). Close()' после 'session.refresh (obj)', но без успеха. – literg

ответ

0

Использование scoped_session см http://docs.sqlalchemy.org/en/latest/orm/contextual.html

Если вы делаете, вы получите тот же сеанс (соединение ID) каждый раз, когда вы запрашиваете его. Кроме того, вам не нужно вызывать refresh(): add() и flush() должно быть достаточно, обновленные значения должны быть доступны после flush() и перед commit(), но только если вы используете тот же самый идентификатор сеанса (транзакция базы данных), чтобы просмотреть их (следовательно, вам нужен scoped_session).

+0

К сожалению, это не помогло. Что касается другого предложения commit() очищает содержимое объектов, они обновляются, когда я попытаюсь получить доступ к их полям. Для меня это не происходит, потому что объекты после фиксации используются вне сеанса. Любопытно то, что я попытался создать минимальный реплицируемый пример, но когда я внедрил использование sqlalchemy, он работал нормально. – literg