WEBアプリケーションの会員登録などにおいて、ユーザ名とかメールアドレスとかを一意にしたい場合、アプリケーション側で一意チェックを実装するのは勿論、RDBMS側でもUnique制約をかけておいて整合性を担保しますよね。

app engineにはそんなモンないですが、擬似的に実現する方法はあります。

Google App EngineではRDBMSのようなUnique Indexをサポートしていません。ユニーク制限を実現する場合は、トランザクション中でKeyを使ったgetとputを組み合わせる必要があります。

App Engineのユニーク制限を正しく理解しよう – ひがやすを blog

slim3では上記を行うメソッドが用意されているようです。

boolean putUniqueValue(String uniqueIndexName, String value)

これはuniqueIndexNameというKindでvalueというKeyNameのキーを持つエンティティをTx内でputすることでその一意性を保証するというメソッド。

Slim3 Datastoreのputを読む – bufferings

便利です。

slim3のJavaDocを見ただけでは、イマイチ使い方がわかりにくいですね。

兎に角やってみました。

多分、こんな感じだと思うんですよ。

Transaction tx = Datastore.beginTransaction();
    if (Datastore.putUniqueValue("uniqueUserId",user.getUserId())) {
        throw new Excepiton("not unique");
        return;
    }
    Datastore.put(tx, user);
    Datastore.commit(tx);

これで意図通りに動いている様に見えます。

これで実際にアプリケーションを動かすと、putUniqueValueの第一引数の名前でKindが出来る。このKindはKEYだけのKindで、ここに第二引数が追加されていく。同一のKEYははじかれる事で、一意制限っぽい動きを実現している様です。

なので、第一引数はそれと判りやすい接頭語とかを付けといた方がよさそうです。

かゆいトコだらけのapp engineだけど、slim3なら結構手が届く感じがします。

ですが、app engine も slim3 も、未だドキュメントが充実していなくて、こういう tips が探しにくいです。

判る人には判るので良いのですが、自分が使うと決めたフレームワークはもっと流行って欲しいわけです。

なので、私のような凡人でも安心して使える様にする為に、ドキュメントを可能な限り書いていこうと思っています。