2010-10-25 2 views
0

При запуске mapreduce в Google App Engine я иногда сталкиваюсь с ключевой ссылкой, которая недействительна. Я хотел бы сделать эффективный метод, который я мог бы использовать для любой модели, используя mapreduce, чтобы убедиться, что все ключевые ссылки для каждого объекта все еще действительны. Какой был бы самый эффективный способ сделать это? Вот моя идея функции карты до сих пор.В Python версии Google Appengine mapreduce, каков наиболее эффективный способ проверки правильности ссылок на ключевые слова?

#map function 
def check_all_references(entity): 
    for attr, value in entity.__dict__.iteritems(): 
    if type(value)== #google.appengine.api.datastore_types.Key: 
     #Check to see if the referenced entity exists 
     .... 
     if referencedEntityExists: return 
     else: 
     logging.error('Entity %s referenced entity %s which is not valid.', entity, referencedEntity) 

ответ

1

Что вам нужно сделать, это аккумулировать все ключи и сделать пакетный получить на них, чтобы проверить, какие из них все еще существуют:

def check_all_references(entity): 
    # Construct a dict mapping reference property names to keys 
    refs = dict((name, prop.get_value_for_datastore(entity)) 
       for name, prop in entity.properties().items() 
       if isinstance(prop, db.ReferenceProperty)) 
    # Fetch all the referenced entities 
    entities = db.get(refs.values()) 
    for (name, key), entity in zip(refs, entities): 
    if not entity: 
     logging.error("Entity %s property %s references entity %s which does not exist", 
        entity.key(), name, key) 
+0

Должны «рефов» и переменные «refkeys» быть все тоже самое? Я получаю глобальное имя «refkeys» не определяется этим кодом. – Chris

+0

Вы правы, они должны быть. Рефакторинг терпит неудачу. –

Смежные вопросы