ページの先頭行へ戻る
Enterprise Postgres 15 アプリケーション開発ガイド

4.4.4 注意事項

タイププラグインについて

  

各タイププラグインに関する注意事項

各タイププラグインに関する注意事項を説明します。

NodaTime

PostgreSQLのデータ型とNodatimeのデータ型のマッピングを説明します。

マッピングテーブル

PostgreSQLの
データ型

既定のNodaTime

追加されるNodaTime

備考

timestamp with time zone

Instant

ZonedDateTime(注1), OffsetDateTime(注1)

データベース内のUTCタイムスタンプです。UTC ZonedDateTimeおよびOffsetDateTimeのみがサポートされます。

timestamp without time zone

LocalDateTime(注2)

未知または暗黙のタイムゾーンのタイムスタンプです。

date

LocalDate

タイムゾーンやオフセット情報を持たない単純な日付です。

time without time zone

LocalTime

タイムゾーンやオフセット情報を持たない単純な時刻です。

time with time zone

OffsetTime

時刻とオフセットを格納する型です。一般的に使用は推奨されません。

interval

Period

Duration

秒未満の単位から年までの時間間隔です。[NodaTime Duration] は、日とそれより短い間隔でサポートされていますが、年や月ではサポートされていません (これらには絶対期間がないため) 。期間は、任意の間隔単位で使用できます。

tszrange

Interval

NpgsqlRange<Instant> など

2つの時間インスタンス(開始と終了)間の時間間隔です。

strange

NpgsqlRange<LocalDateTime>

未知または暗黙のタイムゾーンの2つのタイムスタンプ間の時間間隔です。

daterange

DateInterval

NpgsqlRange<LocalDate> など

2つの日付の間隔です。

注1) Npgsql.EnableLegacyTimestampBehaviorが有効な場合、ZonedDateTimeまたはOffsetDateTimeの書き込みまたは読み取りは自動的にUTCに変換されます。

注2) Npgsql.EnableLegacyTimestampBehaviorが有効な場合 、timestamp without time zoneはデフォルトでLocalDateTimeではなくInstantにマップされます。

Json.NET

JSONプラグインがセットアップされると、ユーザーは透過的にCLRオブジェクトをJSON値として読み書きでき、プラグインはそれらを自動的にシリアル化/逆シリアル化します。

以下にコード例を示します。

// Write arbitrary CLR types as JSON
using (var cmd = new NpgsqlCommand(@"INSERT INTO mytable (my_json_column) VALUES (@p)", conn))
{
    cmd.Parameters.Add(new NpgsqlParameter("p", NpgsqlDbType.Jsonb) { Value = MyClrType });
    cmd.ExecuteNonQuery();
}

// Read arbitrary CLR types as JSON
using (var cmd = new NpgsqlCommand(@"SELECT my_json_column FROM mytable", conn))
using (var reader = cmd.ExecuteReader())
{
    reader.Read();
    var someValue = reader.GetFieldValue<MyClrType>(0);
}

NetTopologySuite (空間型)

デフォルトでは、プラグインはGeometryServiceProvider.InstanceのDefaultCoordinateSequenceFactoryによって提供される縦座標のみを処理します。 GeometryServiceProviderが自動的に初期化されると、X座標とY座標が処理されます。動作を変更するには、次の例のようにhandleOrdinatesパラメーターを指定します。

conn.TypeMapper.UseNetTopologySuite(handleOrdinates: Ordinates.XYZ);

M座標を処理するには、GeometryServiceProvider.InstanceをDotSpatialAffineCoordinateSequenceFactory に設定されたcoordinateSequenceFactoryを使用して、新しいNtsGeometryServicesインスタンスに初期化する必要があります。

// Place this at the beginning of your program to use the specified settings everywhere (recommended)
GeometryServiceProvider.Instance = new NtsGeometryServices(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM),
    new PrecisionModel(PrecisionModels.Floating),
    -1);

// Or specify settings for Npgsql only
conn.TypeMapper.UseNetTopologySuite(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM));

ジオメトリ値の読み書き

データベースからPostGIS値を読み込むと、Npgsqlは適切なNetTopologySuite型(Point、LineStringなど)を自動的に返します。 Npgsqlは、パラメーター内のNetTopologySuite型を自動的に認識し、対応するPostGIS型タイプをデータベースに自動的に送信します。以下のコードは、データベースとNetTopologySuite型のやりとりを示しています。

var point = new Point(new Coordinate(1d, 1d));
conn.ExecuteNonQuery("CREATE TEMP TABLE data (geom GEOMETRY)");
using (var cmd = new NpgsqlCommand("INSERT INTO data (geom) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", point);
    cmd.ExecuteNonQuery();
}

using (var cmd = new NpgsqlCommand("SELECT geom FROM data", conn))
using (var reader = cmd.ExecuteReader())
{
    reader.Read();
    Assert.That(reader[0], Is.EqualTo(point));
}

NpgsqlDbType.Geometryを設定して、パラメータの型を明示的に指定することもできます。


ジオグラフィ(測地座標)サポート

PostGISには、ジオメトリ(デカルト座標の場合)とジオグラフィ(測地座標または球面座標の場合)の2つのタイプがあります。 ジオメトリとジオグラフィの違いについては、PostGISドキュメントを参照してください。ジオグラフィは長距離の計算を行う場合にはるかに正確ですが、計算コストが高くなり、ジオメトリでサポートされる空間操作の小さなサブセットのみをサポートします。

Npgsqlは同じNetTopologySuiteタイプを使用してジオメトリとジオグラフィの両方を表現します。Pointタイプはデカルト空間またはジオグラフィ空間のいずれかのポイントを表します。 通常、PostgreSQLは必要に応じて型をキャストするため、この区別について考慮は不要です。ただし、Npgsqlはデフォルトでデカルトジオメトリを送信することに注意してください。NpgsqlDbType.Geographyを指定することにより、代わりにジオグラフィを送信するようにNpgsqlに指示するオプションがあります。

using (var cmd = new NpgsqlCommand("INSERT INTO data (geog) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", NpgsqlDbType.Geography, point);
    cmd.ExecuteNonQuery();
}

デフォルトでジオグラフィを使用したい場合は、プラグインをセットアップするときにそれを指定することもできます。

NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite(geographyAsDefault: true);

GeoJSON (空間型)

GeoJSONプラグインの使用方法は、NetTopologuSuiteと同じです。

  

クエリビルダに関する注意事項

  

メタデータに関する注意事項

  

更新系SQL文の自動生成に関する注意事項

以下の更新不可能な問合せを含むSQL文に対し、更新系のSQL文が生成され、そのSQL文が実行できない場合があります。

更新系SQL文は以下の場合に自動生成されます。

  

分散トランザクションに関する注意事項

トランザクションスコープを利用するアプリケーションは、Microsoft Distributed Transaction Coordinator(MSDTC)と連携することで、分散トランザクションとして動作することができます。この場合、以下の注意が必要です。