Сессия Werkzeug и SQLAlchemy 0.5x

Обновлено:

Пройдя руководство Werkzeug текст ссылки, получил стек с созданием сеанса SQLAlchemy с использованием sessionmaker() вместо create_session(), как рекомендуется.

Примечание: речь идет не о SA, а о Werkzeug.

Учебник Werkzeug:

session = scoped_session(lambda: create_session(bind=application.database_engine,
    autoflush=True, autocommit=False), local_manager.get_ident)

Я спросил, как добиться того же с помощью sessionmaker():

В итоге в этом мне помогли ребята из #pocoo RCI:

session = scoped_session(lambda: sessionmaker(bind=application.database_engine)(),
    local_manager.get_ident)

без () в конце sessionmaker(**args) он продолжал выдавать мне ошибку:

RuntimeError: объект не привязан к приложению

P.S. если удалить лямбда, это не сработает.


person VVP    schedule 18.09.2009    source источник


Ответы (1)


sessionmaker() возвращает фабрику сеансов, а не сам сеанс. scoped_session() принимает фабрику сеансов в качестве аргумента. Поэтому просто опустите lambda: и передайте результат sessionmaker() непосредственно в scoped_session().

person Ants Aasma    schedule 18.09.2009
comment
Не упоминал об этом, я играю с Werkzeug lib и SA. Я пытаюсь использовать SA sessionmaker() вместо session_create(), как рекомендует SA Tutorial. Мне помогли ребята из #pocoo IRC, но я так и не понял, в чем тут фишка. Они добавили () в конце sessionmaker(), и теперь это работает. session = scoped_session(lambda: sessionmaker(bind=application.database_engine, autoflush=True, autocommit=False)(), local_manager.get_ident) - person VVP; 18.09.2009
comment
Вы делаете больше работы для себя, читателей вашего кода и вашего интерпретатора Python, написав его таким образом, вместо того, чтобы слушать Антса Аасму. Вы также нарушаете свой scoped_session. Ваш код создает sessionmaker, а затем вызывает его (возвращая сеанс) и передает этот сеанс в лямбда-выражении в scoped_session. Таким образом, каждый раз, когда scoped_session пытается вернуть новый сеанс, он фактически возвращает тот же сеанс. Опустите lambda и отбросьте () в конце вашего вызова sessionmaker. scoped_session(sessionmaker(*args)) - person jcdyer; 18.09.2009