2016-08-31 13 views
1

Google App EngineのCloud Datastoreに問題があります。Google Cloud Datastoreからエンティティを取得する方法

私は、データベース内の2つのモデルがあります:

class Product(ndb.Model): 
    name = StringProperty(required=True) 
    category = KeyProperty(kind=Category) 
    description = TextProperty(required=True) 
    price = IntegerProperty(required=True) 

そして

class Category(ndb.Model): 
    name=StringProperty(required=True) 

それでは、どのように私は特定のカテゴリに属する​​製品のクラスからすべての件のデータを得ることができますか?リレーショナルSQLで

私が使用:

SELECT * FROM Product WHERE category = 'CertainName'; 

ありがとうございました!

+0

これは本当ではありません...リレーショナルSQLでは、選択する前にProductテーブルをCategoryテーブルに追加する必要があります。残念ながら、データストアはクエリの結合をサポートしていません。すべてを取ってコードに参加させるか、すべてのカテゴリを取得してカテゴリキー(おそらく_非効率的)で商品を問い合わせるか、別のデータモデルを作り出す必要があります... – mgilson

答えて

1

次は、SQLクエリが何をしているかを実行する必要があります。

query = Product.query(Product.category == "CertainName") # Note the "==" 

編集:

を私はちょうどあなたが(@mgilsonありがとう)キーでフィルタリングする必要が実現しました。クエリが少し変更されます。以下に示すように

query = Product.query(Product.category == category_entity.key) 

は、たとえば、あなたがcategory_entityを取得できます:基本的にはちょうど最初にcategory_entityを取得してから、このようなフィルタを適用する必要があり

category_entity = Category.query(Category.name == "SomeCat").fetch() 

は多くのためhttps://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/ndb/queries/snippets.pyを参照してください。情報(query_purchases_for_customer_via_keyを見て)

+0

しかし、 'Product。 category'は_key_フィールドです - 文字列フィールドではないので、このクエリは機能しません。残念ながら、OPは、私が知っている限り、ほとんどのNoSQL環境で実際にはうまく動作しない「テーブル」に参加しようとしています(私は専門家ではありませんが...) – mgilson

+0

@mgilsonキー。 https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/ndb/queries/snippets.pyにはいくつかの例があります – sisanared

+0

右 - 私はそれが可能かどうかを論じません - しかし、私には、OPには、Product.query(product.category.IN(Category.name == 'CategoryName')。fetch(keys_only = True))) 'というようなものが必要であることがわかります。これは、カテゴリクエリが十分な結果を返さない場合には動作しますが、効率的ではありません。私の指摘は、OPが、サポートされていない 'Category'テーブルにある何かによって' Product'テーブルをクエリしようとしています。 NoSQLデータベースか、少なくともGoogleのデータストアによってうまくいきます。 – mgilson

0

あなたは「名前」フィールドに基づいて、クラスのカテゴリーで独自の鍵を生成し、それを使用することができます。

1)新しいカテゴリエンティティを生成する場合

2)特定のカテゴリに対して商品を照会する必要がある場合2)

カテゴリーエンティティはいつでも生成することができますキーを持っているので、後に、あなたが言うことができる:

category_key = Category.create_key(名= 'CertainName')

クエリ= Product.query(製品。 category == category_key)

+0

ありがとうございました。しかし、私はcreate_key()関数を使用することができませんでした。 – pnmtu13894

+0

AttributeError:型オブジェクト 'Owner'に属性 'create_key'がありません。これはその場合のエラーです – pnmtu13894

+0

create_key()を内部のCategoryクラス定義に実装し、ndb.Key(Category、name)のようなものを返す必要があります。 –

関連する問題