GAE Datastore查询ConjunctionNode错误:ndb模型Cron任务报错求助
问题分析与解决
我来帮你排查这个定时任务的错误~你在NDB查询里踩了一个常见的语法坑:NDB的查询过滤器不支持直接使用Python的not运算符,得用字段值比较的方式来表达“未标记过期”的条件。
错误原因
你写的这段查询代码:
expired_books = Books.query(ndb.AND(Books.expiry < curr_time, not Books.expired))
其中not Books.expired不符合NDB的查询规则——NDB无法把Python的逻辑非运算符转换成Datastore能识别的查询过滤条件,这就是报错的根源。
修正后的代码
把not Books.expired替换成Books.expired == False或者Books.expired != True,这两种写法都是NDB支持的字段值比较方式:
from google.appengine.ext import ndb import datetime def deleteindex(): # 建议用utcnow(),和Datastore默认存储的UTC时间保持一致,避免时区误差 curr_time = datetime.datetime.utcnow() # 正确的查询写法 expired_books = Books.query(ndb.AND(Books.expiry < curr_time, Books.expired == False)) # 批量更新标记 books_to_update = [] for book in expired_books: book.expired = True books_to_update.append(book) # 用put_multi批量提交,比逐个put更高效 ndb.put_multi(books_to_update)
额外小提示
如果你的应用部署在GCP上,优先用datetime.datetime.utcnow()获取当前时间,因为Datastore默认存储UTC时区的时间,这样能避免时区差异导致的过期判断不准确。
内容的提问来源于stack exchange,提问作者vkb
相关产品推荐
相关产品推荐

