.NET 用 Amazon QLDB ドライバーで提供されているシリアライザーを使ってみた

2022.08.04

いわさです。

先日、.NET を使って QLDB へアクセスするアプリケーションの構築方法を学びました。

その際には、生の Ion データ型を意識してデータアクセスする必要がありましたが、実は .NET 向けのシリアライザーが提供されていて、こちらを使うと直感的に .NET アプリケーションへ QLDB クライアントを実装することが出来ます。

Amazon.QLDB.Driver.Serialization を導入する

Amazon.QLDB.Driver.Serializationという形で、NuGet パッケージとして提供されています。

% dotnet add package Amazon.QLDB.Driver.Serialization --version 1.0.0
  Determining projects to restore...
  Writing /var/folders/4d/nhd1bp3d161crsn900wjrprm0000gp/T/tmp3jXgkF.tmp
info : Adding PackageReference for package 'Amazon.QLDB.Driver.Serialization' into project '/Users/iwasa.takahito/work/hoge0802qldb/hoge0802qldb.csproj'.
info : Restoring packages for /Users/iwasa.takahito/work/hoge0802qldb/hoge0802qldb.csproj...
info :   GET https://api.nuget.org/v3-flatcontainer/amazon.qldb.driver.serialization/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/amazon.qldb.driver.serialization/index.json 1363ms
:

導入後ですが、まずドライバーの初期化時にシリアライザーを指定します。
そして QLDB のデータ構造にあわせたクラスを定義し、DML の実行時にクエリオブジェクト構築用のジェネリックメソッドへデータ型を指定します。

Program.cs

using Amazon.QLDB.Driver;
using Amazon.QLDB.Driver.Serialization;

var qldb = AsyncQldbDriver
            .Builder()
            .WithLedger("hoge-ledger")
            .WithSerializer(new ObjectSerializer())
            .Build();
var result = await qldb.Execute(async txn => 
{
    await txn.Execute("DROP TABLE Hoge");
    await txn.Execute("CREATE TABLE Hoge");

    //Insert
    var hoge3 = new Hoge { Prop1 = "Hoge33", Prop2 = 33};
    var hoge4 = new Hoge { Prop1 = "Hoge44", Prop2 = 44};
    await txn.Execute(txn.Query<Hoge>("INSERT INTO Hoge ?", hoge3));
    await txn.Execute(txn.Query<Hoge>("INSERT INTO Hoge ?", hoge4));

    //Select
    return await txn.Execute(txn.Query<Hoge>("SELECT * FROM Hoge"));
});
await foreach(var person in result)
{
    System.Console.WriteLine(person.Prop1 + ":" + person.Prop2.ToString());
}

public class Hoge
{
    public string? Prop1 { get; set; }
    public int Prop2 { get; set; }
}

前回は Ion データへアクセスするためにAmazon.IonDotnetなどを使い QLDB 寄りの少し低レイヤーな実装になっていたと思いますが、シリアライザーを導入したことで抽象化され、非常に直感的な実装になりました。

実行してみると、期待どおり動作していますね。

% dotnet run
Hoge33:33
Hoge44:44

ネスト

もうひとつ試してみたいことがあります。
シリアライザーの基本的な使い方に関しては公式ドキュメントへ記載されていましたが、Ion 形式はフラットとは限りません。
入れ子(ネスト)したデータ構造だった場合でもこのライブラリでアクセス出来るのかも確認しておきたいところです。

リファレンスは見つけることが出来なかったのですが、今回は標準的な Json シリアライザーを使う感覚で以下のように実装してみました。

Program.cs

using Amazon.QLDB.Driver;
using Amazon.QLDB.Driver.Serialization;

var qldb = AsyncQldbDriver
            .Builder()
            .WithLedger("hoge-ledger")
            .WithSerializer(new ObjectSerializer())
            .Build();
var result = await qldb.Execute(async txn => 
{
    await txn.Execute("DROP TABLE Hoge");
    await txn.Execute("CREATE TABLE Hoge");

    //Insert
    var hoge3 = new Hoge { Prop1 = "Hoge33", Prop2 = 33, PropChild = new HogeChild { Prop3 = "Child33", Prop4 = 3333}};
    var hoge4 = new Hoge { Prop1 = "Hoge44", Prop2 = 44, PropChild = new HogeChild { Prop3 = "Child44", Prop4 = 4444}};
    await txn.Execute(txn.Query<Hoge>("INSERT INTO Hoge ?", hoge3));
    await txn.Execute(txn.Query<Hoge>("INSERT INTO Hoge ?", hoge4));

    //Select
    return await txn.Execute(txn.Query<Hoge>("SELECT * FROM Hoge"));
});
await foreach(var person in result)
{
    System.Console.WriteLine(person.Prop1 
                                + ":" + person.Prop2.ToString() 
                                + ":" + person.PropChild?.Prop3 
                                + ":" + person.PropChild?.Prop4.ToString());
}

public class Hoge
{
    public string? Prop1 { get; set; }
    public int Prop2 { get; set; }
    public HogeChild? PropChild { get; set; }
}

public class HogeChild
{
    public string? Prop3 { get; set; }
    public int Prop4 { get; set; }
}

実行してみましょう。

% dotnet run
Hoge33:33:Child33:3333
Hoge44:44:Child44:4444

うまく動いていそうですね。
マネジメントコンソールのクエリエディタでも作成されたデータ構造を確認してみましょう。

良いですね。
ネストしていても問題なく動作することが確認出来ました。

さいごに

本日は、.NET 用 QLDB ドライバーで提供されているシリアライザーを使ってみました。
標準的な Json シリアライザーと同じように使えるので、.NET アプリケーション開発に慣れている方はこれらの QLDB ドライバーとシリアライザーを導入することで簡単にアプリケーションから QLDB の操作を実装出来ると思います。試してみてください。