kev*_*vin 2 python sqlalchemy bottle
我有一个使用Bottlen.py(0.10.11)和SQLAlchemy(0.7.9)使用MySQL作为后端的周末项目。
我遇到了很多“ 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)
Run Code Online (Sandbox Code Playgroud)
在我看来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
[...]
Run Code Online (Sandbox Code Playgroud)
如果我使用MySQL session.query(Link).all()而不是session.query(Link)MySQL,则会话会正确关闭,但是我无法从ORM因素中受益。
如何关闭所有会话?
我究竟做错了什么 ?
当您说时q = session.query(Link),这是一个Query尚未执行的对象。您说的session.close()很好,但是随后该Query对象被传递到您的模板,并对其进行迭代,这在该模板上打开了一个新事务Session以发出SQL。
在这种情况下,您要么希望all()在关闭之前坚持调用Session,要么更灵活地保持Session开放状态,直到模板完成渲染为止。然后,模板也可以引用延迟加载的属性。
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |