はかせのラボ

私の頭の中を書いていく雑記ブログです

AWS UnityからDynamoDBの更新

あいさつ

どうも、はかせです。
前回DynamoDBの読み込みができたので
今回はDynamoDBの更新をやってみます。

やり方

PythonなどでDynamoDBを更新しようとすると
update_itemとかを使うのでUnityでもそうかと思ったんですが違いました。

UnityでDynamoDBに対してできる操作は
・保存
・読込
・削除

この三つだけです。

よくデータベース処理で存在する更新や挿入がありませんね。
ではUnityではどうやってやるのか。
答えは極めて単純で読込→上書き保存です。

まずはコードから行きましょう。

Context.LoadAsync<TestTable>(hashKey: test.action, (res) =>
{
    if (res.Exception == null)
    {
        var temp = res.Result;
        temp.infos.Add("Hakase");
        Context.SaveAsync<TestTable>(temp, (res2) => 
        {
            if(res2.Exception == null)
            {
                print("Update");
            }
        });
    }
    else
    {
        print(res.Exception);
    }
});

LoadAsyncは前回読込で使いました。
hakase0274.hatenablog.com

SaveAsyncは初出ですが、
実は最初のサンプルを動かしたときに使っています。

名前の通り渡されたものを保存するのですが、
この保存処理が場合によって変わります

場合というのは保存しようとしたデータに設定された
プライマリキーの値の有無です。
無→挿入
有→更新

という動きになります。

なのでAWSSDKのUnity版にはUpdateやInsert処理が無いわけですね。

さて実行結果を見てみましょうか。
まずは実行前
f:id:hakase0274:20190825214936p:plain
Startという値をキーとして
ActionとStartという文字列が格納されています。

これを先述のコードで更新してみます。
f:id:hakase0274:20190825215028p:plain
無事HAKASEという文字列が追加されました。

そして何やら表示が変わっていますね。
確認してみたところ元々List型で保存されていたのが
更新処理をかけたあとでStringSetという型に変わっていました。
要素の前にあった型を示す文字が消えて見やすいですね。
それぞれのデータ型の詳しい説明は公式のリファレンスをどうぞ
docs.aws.amazon.com

リファレンスを見る限りListの方が便利っぽいですが、
そんな巨大かつ、型が入り乱れたデータを一つのスキーマで扱う気はないので
見やすいセット型の方が個人的には好きですね。

あとがき

今回はDynamoDBの更新でした。
更新だから~挿入だから~と使うメソッドが変わらないのは楽でいいですね。
実にユーザーライクな設計だと思います(^^)

私自身ツールやなんちゃってライブラリを作ることが多いのですが、
こういう使い手が詳細な動きを知らなくても
「あっなんか楽にできたわ~」みたいな作りにしたいですね。
(さすがAmazon製のSDKやで)

それでは今回はこの辺でノシ