【问题标题】:Datastore error: BadValueError: Expected integer, got [0, 1, 2, 3]数据存储错误:BadValueError:预期的整数,得到 [0, 1, 2, 3]
【发布时间】:2020-09-20 10:57:56
【问题描述】:

其他人报告了类似的错误,但给出的解决方案并不能解决我的问题。 For example there is a good answer here. 链接中的答案提到了 ndb 从第一次使用到以后使用的变化,并表明存在问题,因为第一次运行在数据存储中产生 None 。我无法在我的 sdk 的数据存储中重现或看到这种情况发生,但这可能是因为我是从交互式控制台在这里运行它。

我很确定我最初使用 GAE 交互式控制台运行良好,但此后每次运行都失败,并在我的标题中出现错误。

我将打印语句留在了以下代码中,因为它们显示了良好的结果,并向我保证在最后的 put() 中发生了错误。

from google.appengine.ext import ndb

class Account(ndb.Model):

    week = ndb.IntegerProperty(repeated=True)
    weeksNS = ndb.IntegerProperty(repeated=True)
    weeksEW = ndb.IntegerProperty(repeated=True)

terry=Account(week=[],weeksNS=[],weeksEW=[])
terry_key=terry.put()
terry = terry_key.get()
print terry

for t in list(range(4)):     #just dummy input, but like real input
    terry.week.append(t)
print terry.week

region = 1                   #same error message for region = 0
if region :
    terry.weeksEW.append(terry.week)
else:
    terry.weeksNS.append(terry.week)

print 'EW'+str(terry.weeksEW)
print 'NS'+str(terry.weeksNS)
terry.week = []
print 'week'+str(terry.week)
terry.put()

我的代码的想法是首先逐步建立 terry.week 列表值,然后将整个列表存储到适当的区域,无论是 NS 还是 EW。所以我正在寻找这个方案的解决方法。

错误消息可能没有任何价值,但我在这里复制它。

Traceback (most recent call last):
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/request_handler.py", line 237, in handle_interactive_request
    exec(compiled_code, self._command_globals)
  File "<string>", line 55, in <module>
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 3458, in _put
    return self._put_async(**ctx_options).get_result()
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/tasklets.py", line 383, in get_result
    self.check_success()
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/tasklets.py", line 427, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/context.py", line 824, in put
    key = yield self._put_batcher.add(entity, options)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/tasklets.py", line 430, in _help_tasklet_along
    value = gen.send(val)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/context.py", line 358, in _put_tasklet
    keys = yield self._conn.async_put(options, datastore_entities)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1858, in async_put
    pbs = [entity_to_pb(entity) for entity in entities]
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 697, in entity_to_pb
    pb = ent._to_pb()
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 3167, in _to_pb
    prop._serialize(self, pb, projection=self._projection)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1422, in _serialize
    values = self._get_base_value_unwrapped_as_list(entity)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1192, in _get_base_value_unwrapped_as_list
    wrapped = self._get_base_value(entity)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1180, in _get_base_value
    return self._apply_to_values(entity, self._opt_call_to_base_type)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1352, in _apply_to_values
    value[:] = map(function, value)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1234, in _opt_call_to_base_type
    value = _BaseValue(self._call_to_base_type(value))
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1255, in _call_to_base_type
    return call(value)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1331, in call
    newvalue = method(self, value)
  File "/Users/brian/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/model.py", line 1781, in _validate
    (value,))
BadValueError: Expected integer, got [0, 1, 2, 3]

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    我相信错误来自以下几行:

    terry.weeksEW.append(terry.week)
    terry.weeksNS.append(terry.week)
    

    您没有附加另一个整数;当需要一个整数时,您正在附加一个列表。

    >>> aaa = [1,2,3]
    >>> bbb = [4,5,6]
    >>> aaa.append(bbb)
    >>> aaa
    [1, 2, 3, [4, 5, 6]]
    >>> 
    

    ndb.IntegerProperty 测试失败。

    试试:

    terry.weeksEW += terry.week
    terry.weeksNS += terry.week
    

    编辑:要保存列表列表,不要使用IntegerProperty(),而是使用JsonProperty()。更好的是,ndb 数据存储已被弃用,所以...我推荐 Firestore,它默认使用 JSON 对象。至少使用 Cloud Datastore 或 Cloud NDB。

    【讨论】:

    • 您的回答消除了错误,所以我接受了它,但它并没有真正解决我的问题,因为我希望这些周在 terry.weeksEW 和 terry.weeksNS 中保留为单独的列表。也就是说,我想要列表的列表,而那是丢失的。你也能保留它吗?如果没有其他答案,我稍后会重新接受。
    • 那么,你想要的不是 IntegerProperty(),而是 JsonProperty()。真的,您应该做的不是使用已弃用的 ndb,而是转移到 Firestore 或 Firebase。默认情况下,它们是 JSON 属性。见编辑。
    猜你喜欢
    • 2020-06-22
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多