Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 金字塔遍历:如果资源不是链中的最后一个,则更改_getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu_Python_Join_Pyramid_Traversal - Fatal编程技术网

Python 金字塔遍历:如果资源不是链中的最后一个,则更改_getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

Python 金字塔遍历:如果资源不是链中的最后一个,则更改_getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,python,join,pyramid,traversal,Python,Join,Pyramid,Traversal,我有一个关于Pyramid python web框架中URL遍历的问题 想象一下论坛的以下端点: /forum/1 - Returns information about Forum #1 /forum/1/threads/1 - Returns Thread #1 in Forum #1 以下是第一个URL的遍历方式: 将创建一个根资源 Root.\uuuu getitem\uuuu论坛被调用。这将返回ForumDispatch资源。 ForumDispatch.\uuu getitem\u

我有一个关于Pyramid python web框架中URL遍历的问题

想象一下论坛的以下端点:

/forum/1 - Returns information about Forum #1
/forum/1/threads/1 - Returns Thread #1 in Forum #1
以下是第一个URL的遍历方式:

将创建一个根资源 Root.\uuuu getitem\uuuu论坛被调用。这将返回ForumDispatch资源。 ForumDispatch.\uuu getitem\uuuu 1被调用。已为ID为1的论坛查询数据库。如果未找到,则会引发KeyError。如果找到,将返回一个论坛对象,视图查找将以论坛作为上下文开始。 下面是第二个URL的遍历方式

将创建一个根资源 Root.\uuuu getitem\uuuu论坛被调用。这将返回ForumDispatch资源。 ForumDispatch.\uuu getitem\uuuu 1被调用。已为ID为1的论坛查询数据库。如果未找到,则会引发KeyError。如果找到,则返回论坛对象。 论坛.\uuuu getitem\uuuu线程被调用。返回ThreadsDispatch对象 ThreadsDispatch.\uuu getitem\uuuuu 1被调用。在论坛1中查询数据库中的线程1。如果找到它,将返回一个线程对象并开始视图查找,或者引发一个KeyError。 现在,对于第一个URL,发出一个查询。看起来像是选择。。。来自forums.id=1;的论坛;。在第二个URL中,发出两个查询。选择来自forums.id=1的论坛;,然后选择。。。来自thread.id=1和forum.id=1;的线程

我不想发出两个问题。对于第二个URL,查询选择。。。从论坛左侧加入threads.forum_id=forums.id上的线程,其中threads.id=1和forums.id=1;将返回所需的所有信息。然后,如果没有返回行,或者如果返回了论坛但没有返回线程,我可以返回一个KeyError

为了实现这一点,ForumDispatch.\uuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

有没有办法做到这一点


我可以不返回实际的数据库对象,而是创建由ForumDispatch.\uuu getitem\uuuuuuu等返回的虚拟资源,然后让视图执行必要的查询。但是,我觉得让视图担心查询/引发404错误会使我失去一些遍历功能。想法?

您的问题是一个过早优化的书案示例:

通过主键从数据库中获取一行是您的数据库可以执行的最快的操作。我预计大约需要1毫秒或更少的时间

带有联接的查询稍微复杂一些,需要访问两个表和一个索引并执行实际的联接。最确定的是,它将花费更长的时间——比方说,它只比单行获取慢50%,大约1.5毫秒。根据行数的不同,它实际上可能需要更多的时间,因为连接并不是完全免费的

因此,进行两个简单查询的总时间约为2毫秒,而进行连接查询的总时间约为1.5毫秒。因此,您最多只能看到0.5毫秒的差异。或者没有。或者可能会慢一点,你永远不知道。无论如何,如果您将其放在web应用程序的上下文中,与网络延迟、HTTP往返、浏览器页面回流等相比,任何节省都将是微不足道的。花时间优化可以实现一些可测量好处的领域,您将获得更大的回报:

当然,当你发现你的页面在显示一个列表时经常会发出几十个或几百个查询时,是时候花时间在SQLAlchemy中配置急切的加载了。用一个更复杂的查询替换两个简单的查询只会使事情复杂化,而不会带来任何可测量的好处