2017-08-02 96 views
0

我们正在调查我们是否应该从SQLalchemy转到我们项目的peewee。我们希望禁用属性的延迟加载,以便只有在显式连接到执行的查询中时才加载它们。例如:在peewee中禁用延迟加载

for topping in Topping.select().where(Topping.stock > 0): 
     print " - %s (%s): %s pieces left" % (topping.name, topping.category.name, topping.stock) 

打印:

  • 的Mozzarella(奶酪):50片左
  • 罗勒(草本):100张左
  • 辣(肉):60片左

在我的查询中,我没有明确加入ToppingCategory,但它似乎取回它的名字。有什么办法可以禁用它吗?

回答

0

它是花费你一个查询每行来查找类别。查看关于N + 1查询问题的文档:http://docs.peewee-orm.com/en/latest/peewee/querying.html#nplusone

当您访问FK(类别)时,如果它不可用,peewee将加载它,这需要一个SELECT语句。

在你的榜样,你会需要:

一)急切地加载 B类)不访问类别

对于一个),你可以这样写:

query = Topping.select(Topping, ToppingCategory.name).where(Topping.stock > 0) 
for topping in query: 
    print topping.name, topping.category.name 
+0

清除@coleifer。我的问题是,如果开发人员尝试访问该类别时没有获取该类别,是否有提升错误的方法。也有没有办法获得类别ID而无需加载整个对象?谢谢 – valanto

+0

是的,默认情况下会选择分类ID。 YOu可以使用“topping.category_id”访问它,而不会产生查询。如果您对引发异常感到好奇,您可以在测试中看到“assertQueryCount”是如何实现的。基本上附加一个查询日志处理程序,并查看日志消息的计数。 YOu也可以monkeypatch execute_sql()。 – coleifer