我試圖使用下面定義的函式findpins從我的資料存盤中洗掉一批單一種類的物體。引數limit告訴我們要洗掉的Kind Pin物體的數量。
在實踐中,limit將略低于20000,以使每天的洗掉是免費的。我正在做一個keys_only查詢以避免讀取每個物體。
但是在測驗我的代碼時,我得到了以下錯誤。
AttributeError: 'Key' object has no attribute 'delete'
Update 0
如果我不使用pin.delete(),而是使用print pin,我就會看到兩個80字符的字串,我想這就是2個Key。但是我不知道如何使用這些鍵進行洗掉。
Update 1
如果我不使用keys_only=True,而使用keys_only=False,我就可以完成洗掉。但是,我又遇到了一個潛在的收費的讀取,這是很昂貴的。這是否正確?
我怎樣才能解決這個問題?
如果你發現我的策略有其他問題,也請你說出來。
更新2我根據@jccampanero的建議修改的Python代碼很有希望,但是到目前為止在isinstance中失敗了,因為它的引數Model和Key。首先我得到了錯誤資訊NameError: global name 'Model' is not defined。但是,當我用Pin替換Model時,我得到了錯誤資訊NameError: global name 'Key' is not defined,我無法想象用什么來替換Key。我不知道我在用這些新的定義做什么,而且對引數**kwargs感到特別不舒服。所以我真的需要一些幫助。我在正確的軌道上嗎?
Python代碼(經過編輯,增加了2個新的匯入,2個新的def和1個新的洗掉命令):
import os
import pprint
from google.appengine.ext import db
from google.appengine.api import datastore
from google.appengine.datastore import datastore_rpc
def delete_async(models, **kwargs)。
if isinstance(models, (basestring, Model, Key))。
models = [models]
else:
try:
models = iter(models)
except TypeError:
models = [models]
keys = [_coerce_to_key(v) for v in models]
return datastore.DeleteAsync(keys, **kwargs)
def delete(models, **kwargs) 。
delete_async(models, **kwargs).get_result()
class Pin(db.Model)。
name = db.StringProperty()
def findpins(limit)。
pin_query = Pin.all(keys_only=True)
for pin in pin_query.run(limit=limit)。
# was: pin.delete()
洗掉(pin)
findpins(2)
uj5u.com熱心網友回復:
根據庫的源代碼,你可以使用delete函式來達到這個目的:它接受你要洗掉的記錄的鍵。
請考慮在你的代碼中做如下修改(注意使用上述的db.delete函式):
import os
import pprint
from google.appengine.ext import db
class Pin(db.Model)。
name = db.StringProperty()
def findpins(limit)。
pin_query = Pin.all(keys_only=True)
for pin in pin_query.run(limit=limit)。
db.delete(pin)
findpins(2)
uj5u.com熱心網友回復:
你只需要修改2行代碼就可以了
。if isinstance(models, (basestring, db.Model, db.Key))。
db.delete(pin)
最終代碼:
import os
import pprint
from google.appengine.ext import db
from google.appengine.api import datastore
from google.appengine.datastore import datastore_rpc
def delete_async(models, **kwargs)。
if isinstance(models, (basestring, db.Model, db.Key))。
models = [models]
else:
try:
models = iter(models)
except TypeError:
models = [models]
keys = [_coerce_to_key(v) for v in models]
return datastore.DeleteAsync(keys, **kwargs)
def delete(models, **kwargs) 。
delete_async(models, **kwargs).get_result()
class Pin(db.Model)。
name = db.StringProperty()
def findpins(limit)。
pin_query = Pin.all(keys_only=True)
for pin in pin_query.run(limit=limit)。
# was: pin.delete()
db.delete(pin)
findpins(2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/317578.html
標籤:
