python - SQLAlchemy 不关闭与 ORM 的 session ?

标签 python sqlalchemy bottle

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

我遇到了很多“MySQL 服务器已经消失”的问题,并深入了解了一些 session 在我不使用我的程序时会在夜间保持打开状态的事实。

现在我可以看到 MySQL session 在哪里打开,但我不知道我应该如何继续。

这是我的路由器页面 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 session 正确关闭,但我不能受益于 ORM 因素。

如何关闭所有 session ?

我做错了什么?

最佳答案

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

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

关于python - SQLAlchemy 不关闭与 ORM 的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15881439/

相关文章:

Python 包设置 : setup. py,自定义处理包装的 Fortran

python - 通过采样 PDF 创建数组

python - 如何将 1 个字节写入二进制文件?

python - flask/sqlalchemy - OperationalError : (sqlite3. OperationalError) 没有这样的表

python - 使用 Bottle/Uwsgi/nginx 在第一个请求之前执行工作

python - 在 Python Bottle 中使用异步 POST 请求?

python - tornado 使用 AsyncHTTPClient 和 gen 请求 url,使用 raise gen.Return 获取异常

python - SQLAlchemy:插入的刷新顺序错误?

python - 如何关闭 SQLAlchemy session ?

python - 限制用户尝试登录的次数