火曜日, 2月 23, 2010

appenginejsでrunInTransaction!!

appenginejsで、どうしても出来なかった同一トランザクションでのdb登録がやっとできた。GAEでは同一トランザクションでのデータ更新は、
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、

×(昔)
var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});

今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。

(今)
var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});

これで、以下のような一括更新が成功するようになる!!
db.runInTransaction(function() {
db.put([objCom,msg]);
});

ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。