3

我有一个使用 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 因素中受益。

如何关闭所有会话?

我究竟做错了什么 ?

4

1 回答 1

7

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

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

于 2013-04-10T23:08:56.973 回答