なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

C#でNpgsqlを使ってPostgreSQLへアクセス【テーブル作成の基礎】

はじめに
接続ができたら次はデータベーステーブルを作成してみます。
バージョン10から使えるようになった宣言的パーティションを含めて解説しようかと思いましたが思いほのか文字数が多くなり分かりにくくなる可能性もあるのでまずは基礎的な手法の説明を行いたいと思います。
Npgsqlの本家情報は
私の作成するサンプルソースファイルは
標準的なテーブル作成
私がデータ収集などでよく利用する自動採番と自動的に時刻を入れる手法であり自動採番のidはプライマリキーにします。
using NpgsqlConnection con = new("Server=127.0.0.1; Port=5432; User Id=test_user; Password=pass; Database=db_PostgreTest; SearchPath=public");
con.Open();
using NpgsqlCommand cmd = new(@"CREATE TABLE data(id serial PRIMARY KEY, time timestamp DEFAULT clock_timestamp(), name text, numeric integer)", con);
try
{
    _ = cmd.ExecuteNonQuery();
}
catch (PostgresException)
{
}
SQLのクエリ文を実行するのは「NpgsqlCommand」クラスになります。
「using」は「await using」とし非同期な破棄も可能です。
「CREATE TABLE」の次は普通だと「スキーマ名.テーブル名」になりますが接続文字列に「SearchPath」の記述があれば省略可能です。
自分が値を定義しなくても初期値からデータが入力されるごとに数値が+1されるのが「自動採番」です。
この自動採番は「初期値」「最小値」「最大値」「増分値」が設定可能ですが、特に気にしなければ特に設定する必要はありません。
データの型としては2バイトの「smallserial」、4バイトの「seria」、8バイトの「bigserial」があります。
次に日付データでカラム名が「time」です。
これは型の後に「DEFAULT clock_timestamp()」となっていますがINSERT時に何も入力されなければトランザクション開始時刻が自動的に入りますので特に意図した日付にしなければ未入力でOKです。
残りはごく普通の文字列データと数値データ意識して入力すべきはこの2つだけです。
存在してなければテーブル作成
上記のプログラムでは既にテーブルが存在していると例外が発生します。
わざわざテーブルの存在を確認してからテーブルを作成するのは面倒な方は「CREATE TABLE」の後に「IF NOT EXISTS」を加えてください。
テーブルが存在してない時に限りテーブルを作成し、既にテーブルがある時は実行されず例外にもなりません。
using NpgsqlCommand cmd = new(@"CREATE TABLE IF NOT EXISTS data(id serial PRIMARY KEY, time timestamp DEFAULT clock_timestamp(), name text, numeric integer)", con);
try
{
    _ = cmd.ExecuteNonQuery();
}
catch (PostgresException)
{
}
興味のある方は一度テーブルを作成した後に上記プログラムを実行してみてください。
何事もなく終了します。
関連記事