【问题标题】:Werkzeug and SQLAlchemy 0.5x sessionWerkzeug 和 SQLAlchemy 0.5x 会话
【发布时间】:2009-09-18 14:02:38
【问题描述】:

更新:

通过 Werkzeug link text 教程,获得了使用 sessionmaker() 而不是建议的 create_session() 创建 SQLAlchemy 会话的堆栈。

注意:这不是关于 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: 没有对象绑定到应用程序

附:如果删除 lambda 它将不起作用。

【问题讨论】:

    标签: python sqlalchemy werkzeug


    【解决方案1】:

    sessionmaker() 返回会话工厂,而不是会话本身。 scoped_session() 将会话工厂作为参数。所以只需省略lambda: 并将sessionmaker() 的结果直接传递给scoped_session()

    【讨论】:

    • 没提,我在玩 Werkzeug lib 和 SA。我正在尝试采用 SA sessionmaker() 而不是 session_create() 作为 SA 教程建议的做法。来自#pocoo IRC 的人帮助了我,但我仍然不明白它的诀窍是什么。他们在 sessionmaker() 的末尾添加了“()”,现在它可以工作了。 session = scoped_session(lambda: sessionmaker(bind=application.database_engine, autoflush=True, autocommit=False)(), local_manager.get_ident)
    • 通过编写代码而不是听 Ants Aasma 来编写代码,您可以为自己、代码的读者和 Python 解释器做更多的工作。你也破坏了你的scoped_session。您的代码创建一个sessionmaker,然后调用它(返回一个会话),并将该会话在一个lambda 中传递给scoped_session。所以每次scoped_session 尝试返回一个新会话时,它实际上返回的是同一个会话。省略 lambda,并从 sessionmaker 调用的末尾删除 ()。 scoped_session(sessionmaker(*args))
    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 2016-12-16
    • 2015-07-01
    • 2022-11-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多