概要
pg は、PostgreSQL リレーショナルデータベースにアクセスするためのライブラリです。
このページでは pg を直接利用する場合の説明をしています。
pg は汎用リレーショナルデータベースアクセス用ライブラリのバックエンドライブラリとして使われることもあります。
pg を直接利用するのではなく汎用リレーショナルデータベースアクセス用ライブラリを使うことも念頭に置く必要があります。
pg をインストールする
以下のコマンドを実行して pg gem をインストールします。
gem install pg
pg で PostgreSQL に接続する
前提としてローカルに PostgreSQL がインストールしてあり、postgres ユーザおよびそのユーザのパスワードが設定してあると仮定します。
pg は動作環境に Postgres がインストールされていることが必ず前提になることに注意してください。例えば Heroku Postgres のような Postgres クラウドデータベースなどの外部からアクセス可能な Postgres を利用する場合でも、動作環境に Postgres のネイティブコードが必ず必要になります。
以下のプログラムで PostgreSQL に接続します。
require 'pg' # データベース接続する(不要なものは指定しなくても良い。:port は標準で 5432 が使用される模様) connection = PG::connect(:host => "localhost", :user => "postgres", :password => "postgres ユーザのパスワード", :dbname => "スキーマの名前", :port => "ポート番号") begin # connection を使い PostgreSQL を操作する # ... ensure # データベースへのコネクションを切断する connection.finish end
SELECT 文を実行する
以下に事例を示します。
result = connection.exec("SELECT value1, value2 FROM table1 WHERE key1 = $1 AND key2 = $2", [key1, key2]) # 各行を処理する result.each do |tuple| puts tuple['value1'] puts tuple['value2'] end
既に接続が済んでいることが前提になります。
コネクションに対して exec を呼び出すことで SQL を実行します。SQL 文には $1 や $2 を埋め込むことで、パラメータを設定できます。
戻り値は PG::Result 型です。ntuples(ヒットした行数)や each(各行毎の処理)等のメソッドを使って取得した情報を処理します。
ちなみに各行の値は Hash 型で返ってきます。
COUNT などの関数を使用した値を参照する場合は AS 句を使って明示的に名前をつけましょう。
result = connection.exec( "SELECT COUNT(value1) AS count_value1, MIN(value2) AS min_value2 FROM table1 WHERE key1 = $1 AND key2 = $2", [key1, key2] ) if 0 < result.ntuples then puts result[0]['count_value1'] puts result[0]['min_value2 '] end
INSERT, UPDATE, DELETE 文などを実行する
exec メソッドで同じようにできます。
ただし、戻り値で追加/更新/削除した値は参照できないようです。
INSERT でキーが重複する場合でも例外などで判別はできないので、SELECT FOR UPDATE を使い事前に値を受け取ってから状況に応じて INSERT / UPDATE を使い分けるなどする必要がありそうです。
CREATE TABLE や DROP TABLE 文などを実行する
exec メソッドで同じようにできます。
日本語を使う場合
SQL に日本語を使う場合、exec メソッドを呼び出す前に使用する文字コードを明示的に指定する必要があります。
例えば UTF-8 の文字列を SQL で使う場合は以下の通りです。
connection.internal_encoding = "UTF-8"
この指定は Ruby プログラム側で使用する文字列の指定です。データベースの文字コードとは異なっていても構いません。
コメント
本ページの内容に関して何かコメントがある方は、以下に記入してください。
コメントはありません。 コメント/pg/about