Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解ndb密钥类与密钥属性_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

Python 理解ndb密钥类与密钥属性

Python 理解ndb密钥类与密钥属性,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我已经浏览了文档、文档等问题和答案,但仍在努力理解其中的一小部分。你应该选择哪一种以及什么时候 这是我到目前为止读到的内容(仅示例): 关键类对我来说似乎很简单。当您创建ndb实体时,数据存储会自动为您创建一个密钥,通常采用密钥(种类,id)的形式,其中id是为您创建的 假设你有这两个模型: class Blah(ndb.Model): last_name = ndb.StringProperty() class Blah2(ndb.Model): first_n

我已经浏览了文档、文档等问题和答案,但仍在努力理解其中的一小部分。你应该选择哪一种以及什么时候

这是我到目前为止读到的内容(仅示例):

关键类对我来说似乎很简单。当您创建ndb实体时,数据存储会自动为您创建一个密钥,通常采用密钥(种类,id)的形式,其中id是为您创建的

假设你有这两个模型:

class Blah(ndb.Model):
     last_name = ndb.StringProperty()

class Blah2(ndb.Model):
     first_name = ndb.StringProperty()
     blahkey = ndb.KeyProperty()
因此,只需使用密钥类型,您就可以让Blah1成为家长(或者有几个姓氏相同的家庭成员)

然后:

到目前为止还不错(我认为)。现在介绍Blah2的KeyProperty。假设Blah1仍然是相同的

lname3 = Blah2( first_name = "Louis", blahkey = fname_key)
lname3.put()
这是正确的吗

如何查询各种事物

查询姓氏:

Blah.query() # all last names
Blah.query(last_name='Bonaparte') # That specific entity.
名字:

Blah2.query()
napol =   Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??

bona = bonakey.get() # I think this might be redundant
这就是我迷路的地方。如何使用key或keyproperty从名字中查找Bonaparte。我没有在这里加上它,也许应该加上,这是关于父母、外祖父母、外祖父母的讨论,因为钥匙跟踪祖先/父母


您将如何以及为什么使用KeyProperty和固有的key类。再想象一下你有3个传感器s1,s2,s3。每个传感器都有数千个读数,但您希望保持与s1相关的读数,以便可以用图表显示s1今天的所有读数。你会用哪一种?KeyProperty还是key类?如果其他地方已经回答了这个问题,我很抱歉,但是我没有看到关于选择哪一个以及为什么/如何选择的明确示例/指南。

我也是NDB的新手,现在我仍然不了解所有内容,但我认为当您为Napoleon创建Blah2时,您需要家长查询它,否则不会出现。例如:

napol = Blah2.query(first_name = "Napoleon")
不会得到任何结果(并且您没有使用正确的NDB格式),但使用父级可以:

napol = Blah2.query(ancestor=fname_key).filter(Blah2.first_name == "Napoleon").get

我不知道这是否为你的问题提供了一些线索。

我认为困惑来自使用钥匙。键与实体内部的任何属性都不关联,它只是定位单个实体的唯一标识符。它可以是数字或字符串

幸运的是,除了这一行之外,您的所有代码看起来都不错:

fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 
构造一个键需要一个唯一的ID,它与属性不同。也就是说,它不会将变量
lname.last\u name
与属性
last\u name
相关联。相反,您可以这样创建记录:

lname = Blah(id = "Bonaparte")
lname.put()
lname_key = ndb.Key('Blah', "Bonaparte")
class Readings(ndb.Model):
    sensor = ndb.StringProperty()
    reading = ndb.IntegerProperty()
您保证只有一个具有该ID的Blah实体。事实上,如果您使用类似last_name的字符串作为ID,则不需要将其存储为单独的属性。将实体ID视为唯一的额外字符串属性

接下来,注意不要假设Blah.last_name和Blah2.first_name在查询中是唯一的:

lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()
如果您多次这样做,将有多个名为Napoleon的实体(所有实体都具有相同的父密钥)

继续上面的代码:

napol =   Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??
bona = bonakey.get() # I think this might be redundant
napol
保存的是查询,而不是结果。您需要调用
napol.fetch()
来获取所有具有“Napolean”的实体(或者
napol.get()
如果您确定只有一个实体)。
bonakey
则相反,它持有父实体是因为get()而不是Bonaparte的键。如果您不使用.get(),则
bona
将正确地拥有父对象

最后,请回答有关传感器的问题。您可能不需要KeyProperty或“固有”键。如果你有这样的阅读课:

lname = Blah(id = "Bonaparte")
lname.put()
lname_key = ndb.Key('Blah', "Bonaparte")
class Readings(ndb.Model):
    sensor = ndb.StringProperty()
    reading = ndb.IntegerProperty()
然后,您可以将它们全部存储在一个表中,而无需键。(您可能希望包含时间戳或其他属性。)稍后,您可以使用此查询检索:

s1_readings = Readings.query(Readings.sensor == 'S1').fetch()