ฉันกำลังพยายามค้นหาข้อมูลบางอย่างโดยใช้ 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 == '[email protected]').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', '=', '[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 = []
เมื่อดูเอกสารประกอบสำหรับ add_filter
ดูเหมือนว่า Entity.key
จะเป็น ประเภทที่รองรับ:
ค่า (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
kind: "Data"
Filter {
op: 5
property <
name: "User"
value <
ReferenceValue {
app: "s~app-id"
PathElement {
type: "User"
name: "user_string_id"
}
}
>
multiple: false
>
}
ไลบรารีทั้งสองใช้เวอร์ชันที่แตกต่างกันของโปรโตเท่าที่ฉันสามารถบอกได้ แต่ข้อมูลที่ส่งผ่าน ดู คล้ายกันมาก...
X
ด้วยคีย์ของเอนทิตีX
ได้อย่างไร ฉันกำลังถามว่าฉันจะสืบค้นตารางX
ด้วยคุณสมบัติที่เก็บคีย์จากเอนทิตีประเภทY
ได้อย่างไร - person mgilson   schedule 17.03.2016