C#/Mono から Npgsql を使って PostgreSQL に接続するプログラムの作成方法について説明します。
環境は CentOS 7 または 8、PostgreSQL 9.6 以降を対象とし、PostgreSQL に接続できる状態になっていることを前提とします。PostgreSQL のインストールや設定がまだであれば、インストール方法は こちらの記事、ローカルホスト以外からの接続受けつけに必要な設定方法は こちらの記事 を参照してください。
-
Mono、NuGet をインストールします。
Mono リポジトリを登録します。
$ curl -s https://download.mono-project.com/repo/centos8-stable.repo | sudo tee /etc/yum.repos.d/mono-centos8-stable.repo [mono-centos8-stable] name=mono-centos8-stable baseurl=https://download.mono-project.com/repo/centos8-stable/ enabled=1 gpgcheck=1 gpgkey=https://download.mono-project.com/repo/xamarin.gpg
コマンドラインに含まれる 2 箇所の
centos8
は CentOS 8 を表します。CentOS 7 の場合はcentos7
に書き替えてください。続いて、Mono、NuGet をインストールします。
$ sudo yum install -y mono-complete nuget (省略) Complete!
EPEL リポジトリでも Mono、NuGet をインストールできますが、NuGet をアップデートしても .NET 用パッケージがインストールできなかったので、Mono リポジトリを使ったほうがよいでしょう。
-
Npgsql をインストールします。
$ mkdir TestNpgsql $ cd TestNpgsql $ nuget install Npgsql -Version 4.1.9 (省略) Successfully installed 'Npgsql 4.1.9' to /home/vagrant/TestNpgsql Executing nuget actions took 4.45 sec
Npgsql とその依存パッケージはカレントディレクトリにインストールされるので、ここでは
TestNpgsql
ディレクトリを作成し、移動した上でインストールしています。また、Npgsql のバージョンは最新だと Mono が対応していないようなので、バージョン 4.1 系列の最新バージョン、ここでは 4.1.9 をインストールしています。Npgsql のバージョン情報は こちらのページ を参照してください。 -
プログラムを作成します。
プログラムの内容はデータベースの一覧を出力するというものです。エラー処理は行っていません。
TestNpgsql.csusing System; using Npgsql; class TestNpgsql { static void Main() { var connString = "Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=password"; using (var conn = new NpgsqlConnection(connString)) using (var cmd = new NpgsqlCommand("SELECT datname FROM pg_database", conn)) { conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader.GetString(0)); } } } } }
変数
connString
には;
区切りでパラメータ名=値
形式で接続先を指定します。パラメータのHost
は接続先のホスト、Port
はポート、Database
はデータベース、Username
はユーザ名、Password
はパスワードを表します。ご自身の環境に合わせて書き替えてください。 -
プログラムをビルドします。
$ mcs -r:Npgsql.4.1.9/lib/net461/Npgsql.dll,System.Data.dll TestNpgsql.cs
-r
オプションにはカンマ,
区切りでメタデータを読み込むアセンブリのパスを指定します。Npgsql のパスはご自身の環境に合わせて書き替えてください。エラーメッセージが出力されず、実行ファイル
TestNpgsql.exe
が生成されれば、プログラムのビルドは成功です。 -
プログラムを実行します。
$ MONO_PATH=$(ls -d */lib/netstandard2.0 | paste -d : -s) mono TestNpgsql.exe postgres template1 template0
環境変数
MONO_PATH
にはコロン:
区切りでアセンブリ格納先のパスを指定します。ここではコマンド置換でカレントディレクトリ内のlib/netstandard2.0
ディレクトリを含むディレクトリを指定しています。エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。
以上でプログラムの作成は完了です。C#/Mono については詳しくないので、コメントがあればよろしくお願いします。