0

Я синхронизирую данные из NDB.Google App Engine - NDB - лучший способ обращения к IN (список)

Как наилучшим образом сделать запрос для всех элементов, исключая список найденных элементов allready, в основном инвертируя операцию IN (list).

Псевдо-пример:

found = [] 
for ele in getElementList(): 
    ndb_data = ndb.get(ele) 
    if ndb_data.is_same_as(ele): 
    update(ele) 
    found.append(ndb_data.key) 
    else: 
    delte(ele) 
for ele in remaining(found): 
    create(ele) 

def remaining(found_list): 
    all = Element.query().fetch() 
    do_not_want = Element.query(Element.key.IN(found_list)).fetch() 
    for ele in all: 
    if ele in do_not_want: 
     all.remove(ele) 
    return all 

Другими словами, функция может остальные (found_list) быть сделаны только с Сингел выборки - не два с полным цикле?

+0

Разве вы не можете просто отменить свой * found_list *? Также попробуйте не использовать переменную 'all' как переменную, так как она построена на python. – Anzel

+0

Дубликат http://stackoverflow.com/questions/20305163/in-ndb-how-to-query-for-items-where-property-a -is-not-in-list-b –

ответ

1

Построив ряд НБД фильтров, мы можем эмулировать «NOT IN» запрос «х = у и х = г!»: Например, (1):

checkList = ['cookieAck', 'newkey', 'tempCelsius'] 
query = UserSetting.query(Setting.name!=checkList[0]) 
for check in checkList[1:]: 
    query = query.filter(ndb.AND(UserSetting.name!=check)) 

settings = query.fetch() 

Практически это выглядит следующее вручную возведенный запрос (2):

query = UserSetting.query(ndb.AND(ndb.AND(UserSetting.name!='cookieAck', UserSetting.name != 'newkey'), UserSetting.name != 'tempCelsius')) 

Обратите внимание, что просто делает следующее тоже работает (3):

query = UserSetting.query(UserSetting.name!='cookieAck', UserSetting.name != 'newkey', UserSetting.name != 'tempCelsius') 

Res ulting Запрос:

Query(kind='UserSetting', filters=OR(AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius')))) 

Примечание: Я также уточнил вопрос, связанный выше.

+0

Это решение может отличать «Превышение предела мягкой частной памяти», если зациклировано ~ 40 раз. –

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