如何查询实体在App Engine NDB中是否存在

1 投票
2 回答
4359 浏览
提问于 2025-04-18 02:31

我在理解NDB的时候遇到了一些困难。总觉得有些地方不太明白。我最困惑的就是关于键(key)、种类(kind)和祖先(ancestor)这几个结构。

我只是想存储一组简单的Json数据。当我存储数据时,我想先检查一下是否已经存在重复的实体(是根据键来判断,而不是数据),这样我就不会存储重复的实体了。

class EarthquakeDB(ndb.Model):
  data = ndb.JsonProperty()
  datetime = ndb.DateTimeProperty(auto_now_add=True)

然后,存储数据的方法是:

quake_entry = EarthquakeDB(parent=ndb.Key('Earthquakes', quake['id']), data=quake).put()

所以我有几个问题:

  1. 在我插入更多数据之前,怎么检查一下那个特定的键是否已经存在?

  2. 我该如何根据键来提取数据进行读取呢?

2 个回答

2

因为你没有提供完整的NDB键(只提供了一个父级),所以你每次插入的键都会是唯一的。可是你为什么要用你自己的实体ID作为父级呢?

我想你是想说:

quake_entry = EarthquakeDB(id=quake['id'], data=quake)
quake_entry.put()

要实现这个,你可以使用:

quate_entry = ndb.Key('Earthquakes', quake['id']).get()

这里有两个很棒的视频,讲的是数据存储、强一致性和实体组。你可以看看这个数据存储介绍和这个数据存储查询、索引和事务

3

经过一些尝试和错误的过程,还有voscausa的帮助,我找到了一个解决这个问题的方法。数据是通过一个循环来读取的。

for quake in data:
  quake_entity = EarthquakeDB.get_by_id(quake['id'])
  if quake_entity:
    continue
  else:
    quate_entity = EarthquakeDB(id=quake['id'], data=quake).put()

撰写回答