1

私には一種の「顧客」がいます。新しい「Customer」が挿入されようとしているときに、Kind 全体をロックするトランザクションを実行したいと考えています。トランザクションは最初にクエリを実行して新しい「顧客」名がまだ存在しないことを確認し、一致するものが見つからない場合はトランザクションの 2 番目の部分で挿入を実行します。このようにして、一意の制約を適用しています (また、操作を 1 秒あたり約 1 回の挿入に制限しています)。

同じエンティティ グループ内のすべての「顧客」エンティティを取得するための私の不十分な解決策は、「CustomersGroup」と呼ばれる単一のレコードを持つ「EntityGroups」と呼ばれる種類を作成することです。この 1 つのレコードは、新しく作成された「Customer」エンティティの親として毎回使用されるため、Kind 全体が 1 つのエンティティ グループにグループ化されます。

私の質問は次のとおりです。'CustomerGroup' などのファントム レコードの使用について懸念があります。何かが発生して紛失または削除された場合、新しい 'Customer' エンティティを同じグループに割り当てることができなかったからです。各「顧客」エンティティの親に、「1111111」などの静的な任意の親を割り当てる方がよいと思いますか? 用語は「仮想ルート エンティティ」だと思いますが、どうすればよいですか?

これをどのように処理するのが最善かについてのアドバイスを手伝ってください!

4

4 に答える 4

3

親として機能するためにCustomerGroupレコードが存在する必要はありません。手でキーを作成し、問題のレコードに親として割り当てるだけです。

存在しなくても削除される心配はありません。

モデルを作成し、別のモデルを親として設定すると、システムはそのモデルが実際に存在することを確認しません (必要もありません)。

たとえば、次のようになります。

rev_key = ndb.Key('CustomerGroup', '11111', 'Customer', 'New_Customer_Name')

ただし、キーが : のモデル('CustomerGroup', '11111')は実際には存在しませんが、祖先チェーンに存在する可能性があります。

于 2012-10-30T18:31:49.197 に答える
3

使用しない理由: NDB の get_or_insert: 既存のエンティティをトランザクションで取得するか、新しいエンティティを作成します。

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_or_insert

于 2012-10-30T16:30:34.283 に答える
1

GrantsV では、一意の制約ごとにプロキシ エンティティを作成し、グループ間トランザクションを使用して通常の書き込みで制約をコミットすることで、これを実現できます。

class UniqueConstraint(db.Model):
  # Consider adding a reference to the owner of the constraint.
  @db.transactional(propagation=db.MANDATORY, xg=True)
  @classmethod
  def reserve(cls, kind, property, value):
    key = cls.__get_key(kind, property, value)
    if db.get(key):
      raise Exception  # Already exists
    cls(key=key).put()

  @db.transactional(propagation=db.MANDATORY, xg=True)
  @classmethod
  def release(cls, kind, property, value):
    db.delete(cls.__get_key(kind, property, value))

  @classmethod
  def __get_key(cls, kind, property, value):
    # Consider using a larger entity group.
    return db.Key.from_path(cls.kind(), '%s:%s:%s' % (kind, property, value))
    # To restrict to 1 insert per second per kind, use:
    # return db.Key.from_path(cls.kind(), kind, cls.kind(), '%s:%s' % (property, value))
于 2012-10-30T20:27:08.853 に答える
0

次のように、親エンティティを作成できます。

class CustomerParent(ndb.Model):
    pass

次に、親エンティティをインスタンス化して保存します。

customers_parent = CustomerParent()
customers_parent.put()

最後に、すべての顧客エンティティを作成するときに、親を指定します。

a_customer = Customer(parent=customers_parent.key, ...)
a_customer.put()

お役に立てれば!

于 2012-10-30T15:44:11.370 に答える