SQLAlchemy load_only和defer

时间:2014-01-15 18:44:16

标签: python sql sqlalchemy

我尝试使用SQLAlchemy方法load_only并推迟仅从数据库中发送某些列,但我似乎无法让它们工作。

以下是我正在使用的代码:

query = db.session.query(Vendor).options(defer('ownerName', 'boxSize', 'boxes', 'lastPickUp', 'zone', 'code'))
return response( query )

* response是我编写的自定义jsonify方法,因为我的应用程序的特定需求。

我期待着回应:

  

{

     

“回应”:[

{

  "address": "10th and SW Alder St",

  "city": "Portland, OR",

  "id": 1, 

  "keywords": "Tacos, Mexican",

  "latitude": 45.5206464, 

  "longitude": -122.68157559999997, 

  "name": "Taco Ted",

  "phone": null, 

  "website": null,

},
     

...

但相反,我得到了:

  

{

     

“回应”:[

{

  "address": "10th and SW Alder St", 

  "boxSize": null, 

  "boxes": 10, 

  "city": "Portland, OR", 

  "id": 1, 

  "keywords": "Tacos, Mexican", 

  "lastPickUp": "01/12/2014", 

  "latitude": 45.5206464, 

  "longitude": -122.68157559999997, 

  "name": "Taco Ted", 

  "ownerName": null, 

  "phone": null, 

  "website": null, 

  "zone": 1

}, 
     

...

这意味着我的推迟被忽略了。我已经尝试使用load_only来解决这个问题,但它们似乎没有任何区别。我在这里缺少什么?

(如果它有任何区别我正在使用sqlite数据库进行开发。)

1 个答案:

答案 0 :(得分:4)

这不是deferred()的正确用法,您在此处使用的用例是添加load_only()的原因。每次调用deferred()一次只能执行一个属性;它接受许多字符串的事实与查询中的“路径”有关,这不是你在这里处理的。

load_only()将阻止在初始查询中加载未命名的属性:

load_only('ownerName', 'boxSize', 'boxes', 'lastPickUp', 'zone', 'code')

但是,如果你的jsonify方法仍然调用那些属性,比如somevendor.boxSize,那么它将在那时发出SQL。所以它取决于你如何拉动属性。