SQLAlchemy没有关闭与ORM的会话?

时间:2013-04-08 14:14:17

标签: python sqlalchemy bottle

我有一个使用MySQL作为后端的Bottle.py(0.10.11)和SQLAlchemy(0.7.9)的周末项目。

我有很多“MySQL服务器已经消失”,并将其深入研究了一些事实,即当我没有使用我的程序时,某些会话会在晚上打开。

现在我可以看到MySQL会话处于打开状态但我不知道应该如何继续。

这就是我在路由器页面web.py

中的内容
[...]
db = create_engine('mysql://USER:PASSWORD@DATABASE', poolclass=NullPool)
session = scoped_session(sessionmaker(bind=db))

@route("/")
    links = session.query(Link)

    session.close()
    return bottle.template("index", links=links)

在我看来index.tpl

[...]
%for link in links:
    <div class="link">
        <a class="link" href="{{link.url}}">{{link.title}}</a> 
        %for tag in link.tags:
            <a href="/tag/{{tag.text}}" class="tag">{{tag.text}}</a>
        %end
        <a href="/edit/{{link.id}}">edit</a>
    </div>
%end
[...]

如果我使用session.query(Link).all()代替session.query(Link),MySQL会话将被正确关闭,但我无法从ORM因素中受益。

如何关闭所有会话?

我做错了什么?

1 个答案:

答案 0 :(得分:3)

当你说q = session.query(Link)时,那是一个尚未执行的Query对象。你说session.close()很好,但是那个Query对象会被传递给你的模板而你会遍历它,这会在Session上打开一个新的事务来发出SQL。

在这种情况下,您希望在关闭all()之前坚持调用Session,或者更灵活地让Session保持打开状态,直到模板完成呈现。然后模板也可以引用延迟加载的属性。