Saya mencoba menanyakan beberapa data menggunakan gcloud
api yang baru saya temukan. Saya ingin menanyakan KeyPropery
. misalnya.:
from google.appengine.ext import ndb
class User(ndb.Model):
email = ndb.StringProperty()
class Data(ndb.Model):
user = ndb.KeyProperty('User')
data = ndb.JsonProperty()
Di GAE, saya dapat menanyakan ini dengan mudah dengan asumsi saya memiliki kunci pengguna:
user = User.query(User.email == '[email protected]').get()
data_records = Data.query(Data.user == user.key).fetch()
Saya ingin melakukan hal serupa menggunakan gcloud
:
from gcloud import datastore
client = datastore.Client(project='my-project-id')
user_qry = client.query(kind='User')
user_qry.add_filter('email', '=', '[email protected]')
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 = []
Melihat dokumentasi untuk add_filter
, tampaknya Entity.key
bukanlah jenis yang didukung:
value (int, str, bool, float, NoneType, :class
datetime.datetime
) – Nilai yang akan difilter.
Apakah mungkin menambahkan filter untuk properti utama?
Saya telah melakukan sedikit penyelidikan untuk mencoba mencari tahu apa yang sebenarnya terjadi di sini. Saya tidak yakin ini berguna bagi saya untuk memahami masalah ini saat ini, tapi mungkin akan bermanfaat bagi orang lain.
Saya telah meniru panggilan mendasar di perpustakaan masing-masing untuk mencatat buffer protokol yang sedang diserialkan dan dikirim ke server. Untuk GAE, tampaknya Batch.create_async
di rel datastore_query.
Untuk gcloud
, ini adalah datastore.Client.connection.run_query
metode. Melihat buffer protokol yang dihasilkan (dianonimkan), saya melihat:
permintaan 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"
}
}
}
}
}
}
}
Permintaan GAE hal.
kind: "Data"
Filter {
op: 5
property <
name: "User"
value <
ReferenceValue {
app: "s~app-id"
PathElement {
type: "User"
name: "user_string_id"
}
}
>
multiple: false
>
}
Sejauh yang saya tahu, kedua perpustakaan menggunakan versi proto yang berbeda, tetapi data yang dikirimkan terlihat sangat mirip...
X
dengan Kunci entitasX
. Saya bertanya Bagaimana cara menanyakan tabelX
berdasarkan properti yang menyimpan Kunci dari entitas sejenisY
. - person mgilson   schedule 17.03.2016