3

AppEngineのドキュメントには、AppEngineのネイティブテクニックを使用してネイティブオブジェクトに対してトランザクションクエリを実行する、トランザクションの例がいくつかあります。

http://www.allbuttonspressed.com/projects/django-nonrel [1]のドキュメントによると、AppEngineトランザクションを使用してDjangoオブジェクトをクエリしたいと思います。これは可能ですか?

def txn():
    index = random.randint(0, NUM_SHARDS - 1)
    shard_name = "shard" + str(index)
    counter = SimpleCounterShard.objects.filter(name=shard_name)
    # Make counter if it doesn't exist 
    if not len(counter):
        counter = SimpleCounterShard(name=shard_name)
    counter.count += 1
    counter.put()
db.run_in_transaction(txn)

これは現在、「トランザクション内で許可されるのは祖先クエリのみ」で失敗します。これが祖先のクラスに関係する何かをするように私に求めていることは理解していますが、何が、なぜかはわかりません。

任意のヒント?

[1]「DjangoのトランザクションAPIを使用することはできません。特定のDBが特別な種類のトランザクション(App Engineのrun_in_transaction()など)をサポートしている場合は、プラットフォーム固有の関数を使用する必要があります。」

4

4 に答える 4

1

ネイラーは彼の答えで頭を打った(駄洒落で申し訳ありません):DjangoAEはエンティティグループをサポートしていません。ただし、この進取的な開発者のdjangoappengineのブランチには非公式のサポートがあります。

https://github.com/django-nonrel/djangoappengine/pull/10

パッチはまだ完成していませんが、数週間以内に試してみる予定で、ここで更新します。

于 2012-02-15T07:04:15.703 に答える
1

エラー メッセージが示すように、App Engine のトランザクション内で許可されるのは、特定のタイプのクエリのみです。具体的には、.ancestor()フィルタを適用するものです。実行しようとしているようなクエリは、トランザクションとして実行できません。

1 つのオプションは、トランザクションの外部でクエリを実行し、結果を渡すことです。名前でシャード カウンターの特定のシャードを取得しようとしているように見えますが、クエリを使用しなくても可能であるはずですキー名で識別される必要があるためです。ただし、私は Django のモデル API に詳しくないので、Django でこれを行う方法を提案することはできません。

于 2011-04-06T01:40:59.510 に答える
0

通常の Django オブジェクトのトランザクションを含む、AppEngine WebApp Sharded Counter サンプルの Django ポートは、次の場所にあります。

https://bitbucket.org/twanschik/sharded-counters-nonrel . sharded_counters/models.py を確認してください。これには、前述の単一の読み取り/インクリメント/書き込み操作が含まれています。

具体的には、@commit_lockedデコレーターを使用して、Django モデルをアトミックに読み取り/書き込み/インクリメントできます。

ただし、トランザクション内で実行できるクエリは限られていることに注意してください。2011 年 1 月現在、Django nonrel はエンティティ グループをサポートしていません。これが上記のエラーの原因です。

于 2011-04-19T16:42:38.017 に答える