Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy Marshmallow查询和序列化为JSON的速度较慢_Python_Json_Sqlalchemy_Flask Sqlalchemy_Marshmallow - Fatal编程技术网

Python SQLAlchemy Marshmallow查询和序列化为JSON的速度较慢

Python SQLAlchemy Marshmallow查询和序列化为JSON的速度较慢,python,json,sqlalchemy,flask-sqlalchemy,marshmallow,Python,Json,Sqlalchemy,Flask Sqlalchemy,Marshmallow,我对这有点陌生,所以如果有人能帮助我,那就太棒了 所以我在SQLAlchemy中为我正在开发的烧瓶应用程序设置了一些模型。在我构建应用程序时,我用一些虚假数据填充了db(目前是SQLite),我有点惊讶于我的一个呼叫有多慢 我在数据库中有一个名为Menu的表。菜单有一个子项sections,它有一个子项items。像这样: 菜单 部分 项目 我查询的对象是1个菜单,它有4个部分,每个部分有10个项目 在我的Flask路由中,我使用Menu.query.get(id)查询DB,并使用m

我对这有点陌生,所以如果有人能帮助我,那就太棒了

所以我在SQLAlchemy中为我正在开发的烧瓶应用程序设置了一些模型。在我构建应用程序时,我用一些虚假数据填充了db(目前是SQLite),我有点惊讶于我的一个呼叫有多慢

我在数据库中有一个名为Menu的表。菜单有一个子项sections,它有一个子项items。像这样:

  • 菜单
    • 部分
      • 项目
我查询的对象是1个菜单,它有4个部分,每个部分有10个项目

在我的Flask路由中,我使用Menu.query.get(id)查询DB,并使用marshmallow将其序列化为JSON

整个过程需要250毫秒才能在我的本地机器上返回

因此,我的问题是: 我担心250毫秒是不是很愚蠢? 缓慢的罪魁祸首是什么? -糟糕的模式设计? -SQLite/使用SQL数据库? -还有别的吗

任何帮助都将不胜感激


另外。我最初还有两个更深的层次(项目有选项,可以选择),但完成这项工作需要整整一秒钟的时间,所以当用户请求特定项目时,我将它们移动到一个单独的端点。

我同意250ms是多余的,因为所有内容都是本地的。我认为缓慢的原因是为了构建JSON而执行了多个SQL查询

在SQLALCHEMY配置上设置
SQLALCHEMY\u ECHO=True
将显示正在生成的SQL查询并确认这一点

您还没有提供数据库模型,但是您可能会发现您的关系正在被延迟加载,因此正在为树中的每个对象进行新的SQL查询。您可以在SQLAlchemy文档的一节中找到更多信息


在子关系(即菜单->区段和区段->项目)上设置
lazy='joined'
,将导致使用联接而不是默认选择来急切地加载子关系。

它们正在被延迟加载。我会换成joined,看看是否有任何改进。谢谢,哇。这当然有帮助。在这一变化中下降到50-75毫秒。好奇的是,急加载与懒惰相比有什么缺点吗?数据库将执行连接,因此将做更多的工作,但是如果您知道查询需要数据,那么它是获取数据的最有效的方法(与执行单独的“懒惰”查询相比)。或者,您可以将默认值设置为延迟加载,并在需要加入的查询上使用joinedload()选项。