当前位置: 首页 > 知识库问答 >
问题:

烧瓶-SQLAlChemy和SQLAlChemy

逄嘉熙
2023-03-14

我正在建立一个小网站,我已经在SQLAlChemy中拥有了我所有的模型。该网站将发布一些离线计算的信息。只有结果将被发布到一个精简的数据库,即它包含结果,而不是原始数据,但网站需要查询结果。

我将使用Flask,因为我的模型已经用Python驱动了(通过SWIG在C中进行了一些繁重的工作),我不想使用Django。

我敢肯定,以前有人问过这个问题,通常没有太多理由的咒语是“使用炼金术”。问题是为什么?

如果我自己编写一些会话处理,为什么我必须在SQLAlchemy中重新定义我的数据库。除了必须在我的Flask应用程序中编写一些代码之外:

@app.before_request
def before_request():
  g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
  db = getattr(g, 'db', None)
  if db is not None:
    db.close()

我还需要担心什么?默认情况下,SQLAlchemy甚至为我提供连接池。

共有2个答案

穆鸿卓
2023-03-14

您在问题中输入的代码实际上对Sqlalchemy集成无效。我知道这只是个例子,但我只是以防万一。

对于SqlalChemy集成,您需要做的就是确保在请求结束时通过以下方式清理当前的Db会话

@app.teardown_appcontext
def shutdown_session(exception=None):
    DbSession.remove()

其中DbSession是作用域会话。

下面是您不想使用Flask Sqlalchemy包时的文档。

寿浩言
2023-03-14

实际上,您正在使用Flask构建一个web应用程序,它通过sqlalchemy完成与数据库相关的工作。因此,当您使用应用程序处理的多个请求处理数据库会话时,您必须确定,您正在谨慎地创建和关闭会话。

如果您阅读SQLAlchemy文档,他们建议将会话的生命周期与访问和/或操作数据库数据的函数和对象分开,并与之保持外部性。这将大大有助于实现可预测且一致的事务范围。

web应用程序是最简单的情况,因为这样的应用程序已经围绕一个单一的、一致的作用域构建—这就是请求,它表示来自浏览器的传入请求,处理该请求以形成响应,最后将该响应传递回客户端。将web应用程序与会话集成是将会话的范围与请求的范围链接起来的简单任务。可以在请求开始时建立会话,也可以使用延迟初始化模式在需要时立即建立会话。然后,请求继续进行,在某些系统中,应用程序逻辑可以以与实际请求对象的访问方式相关联的方式访问当前会话。当请求结束时,会话也会被拆除,通常是通过使用web框架提供的事件挂钩。会话使用的事务也可以在此时提交,或者应用程序也可以选择显式提交模式,仅提交那些有保证的请求,但始终在结束时无条件地中断会话。

用外行的话来说,我的意思是

SQLAlchemy中提到了上述操作,因为web应用程序中的会话应该被限定范围,这意味着每个请求处理程序创建和销毁自己的会话。

这是必要的,因为Web服务器可以是多线程的,因此可以同时服务多个请求,每个请求使用不同的数据库会话。

这意味着,如果将SqlAlchemy与Flask一起使用,则必须手动处理会话,如创建作用域会话,并在每次请求时小心地删除它们,否则可能会陷入困境,这会给web应用程序增加额外的复杂性。

但是,还有Flask SqlAlchemy(Flaskapp的SqlAlchemy库的扩展),它提供了基础设施,以帮助将会话的寿命与每个web请求的寿命保持一致。实际上,您还可以在SqlAlchmey文档中发现,他们还建议将此与Flask一起使用。

为每个请求创建一个新的/新的作用域会话。如果你进一步挖掘它,你会在这里找到,它还在app.teardown_appcontext上安装了一个钩子

 类似资料:
  • 我有一个简单的数据库在mysql和我尝试打印结果,但编码是错误的。它发生在orm模型和纯sql模式中。 在相同的sqlalchemy conf下,纯使用工作而烧瓶应用程序不使用。我也试过用php进行简单的测试,它工作的还可以。 我做错了什么? Mysql变量 在config.py中 带有flask-script的命令 输出 python test.py 如果我在每个大小写中打印类型,唯一有效的大小

  • 我有一个烧瓶应用程序,与MySQL使用sqlalChemy连接。DB查询时发生奇怪的错误。 `回溯(最近一次调用):文件“/home/Desktop/work/nesting app/env/lib/python3.8/site packages/sqlalchemy/util/_collections.py”,第1008行,调用返回self。注册表[key]键错误: 在处理上述异常期间,发生了另

  • 我有一个简单的用户模型,定义如下: 当我创建一个新的User对象时,我的字段被设置为当前时间。我想做的是,每当我保存对我的用户对象的更改时,我的字段会自动设置为当前时间。 我找遍了留档,但我似乎找不到任何与此有关的参考资料。我对SQLAlChemy非常陌生,所以我真的没有以前的经验可以借鉴。 希望得到一些反馈,谢谢。

  • 我已经用flask在python上制作了一个restapi(端口:5000),我正在从一个网站(端口:80)发出get和post请求。我收到了cors错误,所以我尝试在RESTAPI中为站点创建一个响应头。但是我得到了导入错误: 我已经下载了烧瓶cors模块并升级它,并确保它是在正确的路径,但它仍然不工作。 API代码:

  • 问题内容: 我正在用React构建Flask应用程序,但最终遇到了路由问题。 后端负责成为API,因此某些路由如下所示: 以及通往React的主要路线: 我在React应用程序中使用react-router,一切正常,react- router带我进入,并获得了渲染视图,但是当我刷新页面时,Flask应用程序会处理此调用,并且会出错。 最好的解决方案是什么?我正在考虑重定向所有未调用的调用,这是不

  • 我发现很难找到有关这方面的资料。会是什么?我如何解决这个问题?有哪些可能的修复方法? UWSGI日志文件 时钟来源:unix检测到CPU核数:4当前工作目录:/home/pi检测到二进制路径:/usr/local/bin/uwsgi!!!没有内部路由支持,重建与pcre支持!!!*警告:您在没有主进程管理器的情况下运行uWSGI进程数限制为7336内存页大小为4096字节检测到最大文件描述符号:6