SQLAlchemy load_only 和 defer

Rub*_*ich 2 python sql sqlalchemy

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

这是我正在使用的代码:

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

*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,

},
Run Code Online (Sandbox Code Playgroud)

...

但我得到的是:

{

“回复”: [

{

  "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

}, 
Run Code Online (Sandbox Code Playgroud)

...

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

(如果有什么区别的话,我正在使用 sqlite 数据库进行开发。)

zzz*_*eek 5

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

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

load_only('ownerName', 'boxSize', 'boxes', 'lastPickUp', 'zone', 'code')
Run Code Online (Sandbox Code Playgroud)

但是,如果您的 jsonify 方法仍然调用这些属性,例如somevendor.boxSize,它将在此时发出 SQL。所以这也取决于你如何提取属性。