sqlalchemy: ошибка фиксации сеанса — объект «SessionMaker» не имеет атрибута «_model_changes»

Я новичок в SqlAlchemy. Мы работали в основном с Flask, но в конкретном случае мне понадобилось ручное подключение к базе данных. Итак, я запустил новое соединение с БД примерно так:

write_engine = create_engine("mysql://user:pass@localhost/db?charset=utf8")
write_session = scoped_session(sessionmaker(autocommit=False,
    autoflush=False,bind=write_engine))

nlabel = write_session.query(Label).filter(Label.id==label.id).first() # Works
#Later in code
ms = Message("Some message")
write_session.add(ms) # Works fine
write_session.commit() # Errors out

Ошибка выглядит так: «AttributeError: объект« SessionMaker »не имеет атрибута« _model_changes »».

Что я делаю не так?


person Neo    schedule 17.09.2012    source источник
comment
Как выглядит модель сообщения? Если вы используете расширение Flask-Sqlalchemy, это может пригодиться: github.com/ mitsuhiko/flask-sqlalchemy/pull/89   -  person aezell    schedule 18.09.2012
comment
write_session действительно должен быть экземпляром Session, а не SessionMaker   -  person Damien    schedule 03.12.2014
comment
Относится к stackoverflow.com/questions/20201809/   -  person Charles L.    schedule 06.03.2019


Ответы (2)


Из документации Я думаю, вы могли пропустить инициализацию объекта Session.

Пытаться:

Session = scoped_session(sessionmaker(autocommit=False, autoflush=False,bind=write_engine))
write_session = Session()

Это выстрел в темноте - я не очень хорошо знаком с SQLAlchemy. Удачи!

person bm1362    schedule 29.10.2012

Ваша проблема в том, что вам не хватает этой строки:

db_session._model_changes = {}
person user2341072    schedule 13.05.2014
comment
пожалуйста, добавьте некоторое объяснение вашего решения и того, как оно решает проблему - person Our Man in Bananas; 14.05.2014
comment
@Philip, потому что flask прикрепляет статический метод к сеансу. Следовательно, перед фиксацией он проверяет _model_changes. См. файл init flask_sqlclchemy.py. Вот функция: def session_signal_before_commit(session): d = session._model_changes if d: before_models_committed.send(session.app, changes=d.values()) - person chfw; 22.05.2014