Данные не обновляются в сеансе sqlalchemy - PullRequest
0 голосов
/ 24 декабря 2018

У меня проблема с обновлением экземпляра в sqlalchemy.Атрибуты экземпляра изменяются после того, как я изменяю их перед фиксацией, но после того, как я фиксирую их, они возвращаются к предыдущим значениям.Session.is_modified (instance) тоже возвращает False даже после обновления данных.

Вот код

from sqlalchemy.orm import sessionmaker, scoped_session


class Backend(object):
"""
"""
def __init__(self):

    self._engine = create_engine("mysql://{0}:{1}@{2}/{3}?charset=utf8".format(DATABASE_CONFIGS.get('master').get('USER'),
                                                                  DATABASE_CONFIGS.get('master').get('PASSWORD'),
                                                                  DATABASE_CONFIGS.get('master').get('HOST'),
                                                                  DATABASE_CONFIGS.get('master').get('DB_NAME')),
                                 pool_recycle=3600,
                                 pool_size= POOL_SIZE,
                                 pool_timeout=1,
                                 echo=False,
                                 convert_unicode=True,
                                 encoding='utf-8')


def get_session(self):
    self._session = scoped_session(sessionmaker(bind=self._engine))
    return self._session


class A():
    attribute_meta = Column(JSONField(), nullable=True)

Вот как этот код выполняется:

def foo():
    backend = Backend()
    session = backend.get_session()
    a = session.query(A).first()
    a.attribute_meta = {'boo':'foo'}
    session.add(a)
    print("data before commit", a.attribute_meta)
    print("is session modified", session.is_modified(a))
    print("data after commit", a.attribute_meta)
    session.commit()
    session.close()

при изменении сеанса возвращает False
данные до того, как коммит возвращает измененный экземпляр с соответствующими данными
данные после того, как коммит возвращает экземпляр с его исходным значением, то есть без изменения

Если я запускаю тот же кодчерез оболочку он работает нормально.
Нет модели сигналов, которые могли бы изменить данные.

Включил echo = True, но все показывает, что это просто команда выбора, которая запускаетсяБД.

Что-то мне не хватает?

1 Ответ

0 голосов
/ 26 декабря 2018

Атрибут, который я пытался изменить, был полем JSON, а sqlalchemy не проверяет изменения в поле JSON.По этой причине эти изменения произошли в инстансе до коммита, но погибли после него.Решение состоит в том, чтобы принудительно сделать экземпляр грязным, т.е. заставить sqlalchemy целенаправленно проверять, что атрибут изменился.

Это изменение кода -

from sqlalchemy.orm.attributes import flag_modified

flag_modified(bag, 'affiliate_meta')  # Just because sqlalchemy doesnt track json field changes, check it before committing the session
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...