PGは、PostgreSQL RDBMSへのRubyインターフェイスです。 PostgreSQL 10以降で動作します。
小さな例の使用法:
#!/usr/bin/env ruby
require 'pg'
# Output a table of current connections to the DB
conn = PG . connect ( dbname : 'sales' )
conn . exec ( "SELECT * FROM pg_stat_activity" ) do | result |
puts " PID | User | Query"
result . each do | row |
puts " %7d | %-16s | %s " %
row . values_at ( 'pid' , 'usename' , 'query' )
end
end 

通常、Ruby/PostgreSQLの以前のバージョンでも動作しますが、それらは定期的にテストされていません。
セマンティックバージョンの原則に従って宝石にタグ付けおよびリリースします。
このポリシーの結果として、2桁の精度で悲観的なバージョンの制約を使用して、このGEMへの依存性を指定することができます(またそうすべきです)。
例えば:
spec . add_dependency 'pg' , '~> 1.0' Rubygems経由でインストール:
gem install pg
Postgresでインストールされた「PG_CONFIG」プログラムへのパスを指定する必要がある場合があります。
gem install pg -- --with-pg-config=<path to pg_config>
バンドラー経由でインストールしている場合は、次のようなコンパイルヒントを提供できます。
bundle config build.pg --with-pg-config=<path to pg_config>
Windowsのビルド/インストール手順については、MacOS Xの下でのインストールおよびreadme-windows.rdocのインストールの詳細については、readme-os_x.rdocを参照してください。
立ち往生している場合、または何かについてチャットしたい場合は、Google+グループとメーリングリストもあります。
署名された宝石としてインストールしたい場合は、GEM署名者の公開証明書がリポジトリのcertsディレクトリにあります。
PGは、rubyまたはネイティブCコードの結果結果とクエリパラメーターをオプションで入力できます。文字列の割り当てが削減され、(遅い)ルビーコードでの変換が省略できるため、これによりデータベースとの間のデータ転送をスピードアップできます。
非常に基本的なタイプのキャストは、次のように有効にできます。
conn . type_map_for_results = PG :: BasicTypeMapForResults . new conn
# ... this works for result value mapping:
conn . exec ( "select 1, now(), '{2,3}'::int[]" ) . values
# => [[1, 2014-09-21 20:51:56 +0200, [2, 3]]]
conn . type_map_for_queries = PG :: BasicTypeMapForQueries . new conn
# ... and this for param value mapping:
conn . exec_params ( "SELECT $1::text, $2::text, $3::text" , [ 1 , 1.23 , [ 2 , 3 ] ] ) . values
# => [["1", "1.2300000000000000E+00", "{2,3}"]]しかし、PGのタイプキャストは非常にカスタマイズ可能です。だからそれは2つのレイヤーに分かれています:
これは下層であり、RubyオブジェクトをDBMSに変換し、デコードクラスを装飾して受信したデータをRubyオブジェクトに変換するエンコードクラスを含む。クラスは、PG :: TextEncoder、PG :: TextDeCoder、PG :: BinaryEncoder、およびPG :: BinaryDecoderの形式と方向に従って名前が付けられています。
タイプOID、フォーマットコード(テキストまたはバイナリ)、およびオプションで名前をエンコーダーまたはデコーダーオブジェクトに割り当てることができます。要素エンコーダー/デコーダーを割り当てることにより、コンポジットタイプを構築することもできます。 PG :: Coderオブジェクトを使用して、PG :: TypeMapを設定するか、文字列表現から単一の値を型に変換することもできます。
次のpostgreSQL列タイプは、ruby-pg(te = text encoder、td = text decoder、be = binary encoder、bd = binary decoder)によってサポートされています。
次のテキストとバイナリ形式もエンコードできますが、列タイプとして使用されていません。
TypeMapは、どのエンコーダー/デコーダーによって変換される値を定義します。このクラスのいくつかの派生によって実装される、異なるタイプマップ戦略があります。それらは、タイプキャストの特定のニーズに従って選択および構成することができます。デフォルトのタイプマップはpg :: typemapallstringsです。
タイプマップは、接続ごとに、または結果セットごとにそれぞれ割り当てることができます。タイプマップは、データストリーミングをコピーおよびアウトするためにも使用できます。 pg :: connection#copy_dataを参照してください。
次のベースタイプマップが利用可能です。
次のタイプマップには、pg :: basictyperegistryからのタイプマッピングが登録されています。
PGは、異なるスレッドが異なるPG ::接続オブジェクトを同時に使用できるように、スレッドセーフです。ただし、複数のスレッドからPGオブジェクトを同時にアクセスすることは安全ではありません。したがって、新しいスレッドごとに新しいデータベースサーバー接続を開くか、スレッドの安全な方法で接続を管理するActiverCordのようなラッパーライブラリを使用してください。
次のようなメッセージがstderrに印刷されている場合、おそらくいくつかのスレッドから1つの接続を使用しています。
message type 0x31 arrived from server while idle
message type 0x32 arrived from server while idle
message type 0x54 arrived from server while idle
message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
PGは、PG-1.3.0以降Ruby-3.0で導入されたFiber.schedulerと完全に互換性があります。 Windowsでは、 Fiber.schedulerのサポートがRuby-3.1以降で利用できます。 IO操作をブロックする可能性はすべて、実行中のスレッドに登録されている場合、 Fiber.schedulerを介してルーティングされます。そのため、PGは同期/ブロッキングメソッド呼び出しでも非同期LIBPQインターフェイスを内部的に使用しています。また、LIBPQのビルトイン関数の代わりにRubyのDNS解像度を使用します。
内部的には、PGは常にLIBPQの非ブロッキング接続モードを使用します。その後、ブロッキングモードで実行するように動作しますが、すべてのブロッキングIOが登録されている可能性のあるFiber.schedulerを介してRubyで処理されることを保証します。 PG::Connection.setnonblocking(true)が呼び出された場合、非ブロッキング状態は有効になりますが、ブロッキング状態の追加処理は無効になるため、呼び出しプログラムはブロッキング状態を単独で処理する必要があります。
このルールの例外はPG::Connection#lo_createや外部ライブラリ(GSSAPI認証など)を使用した認証方法などの大規模なオブジェクトの方法です。それらはFiber.schedulerと互換性がないため、ブロッキング状態は登録されたIOスケジューラに渡されません。つまり、操作は適切に機能しますが、IO待機状態を使用してIOを実行する別のファイバーに切り替えることはできません。
PGは、PG-1.5.0以降Ruby-3.0で導入されたRactorと完全に互換性があります。すべてのタイプEN/デコーダーとタイプマップは、 Ractor.make_shareableによって凍結されている場合、ラクター間で共有可能です。また、凍結したPG ::結果とPG ::タプルオブジェクトを共有できます。すべての凍結オブジェクト(PG ::接続を除く)は、PostgreSQLサーバーとの通信を行うため、または取得したデータを読み取るために使用できます。
PG ::接続は共有できず、各ラクター内で専用の接続を確立する必要があります。
バグを報告したり、機能を提案したり、gitでソースをチェックしたりするには、プロジェクトページをご覧ください。
ソースをチェックアウトした後、すべての依存関係をインストールします。
$ bundle install
クリーンアップ拡張ファイル、パッケージファイル、テストデータベース。これを実行して、PostgreSQLバージョン間を変更します。
$ rake clean
エクステンションをコンパイルします:
$ rake compile
pg_config --bindirが指しているPostgreSQLバージョンでテスト/仕様を実行します。
$ rake test
または、特定のpostgreSQLバージョンでファイルごとに特定のテストを実行します。
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
APIドキュメントを生成します。
$ rake docs
すべてのバグと新機能がテストによって検証されていることを確認してください。
現在のメンテナーは、マイケル・グレンジャー[email protected]とlars kanis [email protected]です。
著者による著作権(c)1997-2022。
このソフトウェアは、Ruby自体と同じ条件で再配布できます。詳細については、ソースのhttps://www.ruby-lang.org/en/about/license.txtを参照してください。
コードの一部はPostgreSQLプロジェクトからのものであり、ファイルPostgresに含まれるPostgreSQLライセンスの条件の下で配布されます。
一部のCopyright Laika、Inc。
長年にわたってこの図書館に貢献してきた多くの追加の優秀な人々については、Contributors.rdocを参照してください。
Ruby-List and Ruby-Devメーリングリストの人々に感謝しています。 PostgreSQLを開発した人々に。