我正在尝试使用gcloud
我刚刚发现的 api 查询一些数据。我想查询一个KeyPropery
. 例如:
from google.appengine.ext import ndb
class User(ndb.Model):
email = ndb.StringProperty()
class Data(ndb.Model):
user = ndb.KeyProperty('User')
data = ndb.JsonProperty()
在 GAE 中,假设我有一个用户的密钥,我可以很容易地查询这个:
user = User.query(User.email == 'me@domain.com').get()
data_records = Data.query(Data.user == user.key).fetch()
我想做类似的事情gcloud
:
from gcloud import datastore
client = datastore.Client(project='my-project-id')
user_qry = client.query(kind='User')
user_qry.add_filter('email', '=', 'me@domain.com')
users = list(user_qry.fetch())
user = users[0]
data_qry = client.query(kind='Data')
data_qry.add_filter('user', '=', user.key) # This doesn't work ...
results = list(data_qry.fetch()) # results = []
查看文档add_filter
,它似乎不是Entity.key
受支持的类型:
value (int, str, bool, float, NoneType, :class
datetime.datetime
) -- 要过滤的值。
是否可以为关键属性添加过滤器?
我做了更多的调查,试图弄清楚这里到底发生了什么。我不确定这对我目前理解这个问题是否有帮助,但也许对其他人有帮助。
我已经模拟了各个库中的底层调用,以记录正在序列化并发送到服务器的协议缓冲区。对于 GAE,它似乎Batch.create_async
位于datastore_query模块中。
对于gcloud
,就是datastore.Client.connection.run_query
方法。查看生成的协议缓冲区(匿名),我看到:
gcloud 查询 pb。
kind {
name: "Data"
}
filter {
composite_filter {
operator: AND
filter {
property_filter {
property {
name: "user"
}
operator: EQUAL
value {
key_value {
partition_id {
dataset_id: "s~app-id"
}
path_element {
kind: "User"
name: "user_string_id"
}
}
}
}
}
}
}
GAE 查询 pb。
kind: "Data"
Filter {
op: 5
property <
name: "User"
value <
ReferenceValue {
app: "s~app-id"
PathElement {
type: "User"
name: "user_string_id"
}
}
>
multiple: false
>
}
据我所知,这两个库使用不同版本的原型,但是传递的数据看起来非常相似......