Kueri penyimpanan data Google dengan kunci di gcloud api

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, :classdatetime.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...


person mgilson    schedule 16.03.2016    source sumber
comment
Saya menambahkan jawaban. Jika cara tersebut berhasil untuk Anda, sebaiknya ajukan masalah pada proyek gcloud-python untuk memperbaiki dokumentasi (dan mungkin pesan kesalahan yang Anda terima dalam kode asli).   -  person Ed Davisson    schedule 17.03.2016
comment
@EdDavisson -- Terima kasih atas jawabannya, tapi entah saya salah memahami jawaban Anda, atau Anda salah memahami pertanyaan saya :-). Saya rasa Anda menjawab pertanyaan -- Bagaimana cara menanyakan tabel X dengan Kunci entitas X. Saya bertanya Bagaimana cara menanyakan tabel X berdasarkan properti yang menyimpan Kunci dari entitas sejenis Y.   -  person mgilson    schedule 17.03.2016
comment
Anda benar sekali -- saya menjawab pertanyaan yang berbeda. Bisakah Anda mengirim email ke alamat di profil saya? Akan sangat membantu jika melihat proto dump asli yang Anda posting di atas.   -  person Ed Davisson    schedule 18.03.2016


Jawaban (1)