我尝试使用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数据库进行开发。)
答案 0 :(得分:4)
这不是deferred()
的正确用法,您在此处使用的用例是添加load_only()
的原因。每次调用deferred()
一次只能执行一个属性;它接受许多字符串的事实与查询中的“路径”有关,这不是你在这里处理的。
load_only()将阻止在初始查询中加载未命名的属性:
load_only('ownerName', 'boxSize', 'boxes', 'lastPickUp', 'zone', 'code')
但是,如果你的jsonify方法仍然调用那些属性,比如somevendor.boxSize
,那么它将在那时发出SQL。所以它取决于你如何拉动属性。