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的較早版本一起使用,但是這些版本尚未定期測試。
我們根據語義版本原理標記並釋放寶石。
由於此策略,您可以(並且應該)使用帶有兩個精度數字的悲觀版本約束來指定對此GEM的依賴。
例如:
spec . add_dependency 'pg' , '~> 1.0' 通過RubyGems安裝:
gem install pg
您可能需要指定使用Postgres安裝的“ PG_Config”程序的路徑:
gem install pg -- --with-pg-config=<path to pg_config>
如果您要通過Bundler安裝,則可以提供類似的編譯提示:
bundle config build.pg --with-pg-config=<path to pg_config>
有關在MacOS X下安裝的更多信息,請參見ReadMe-OS_X.RDOC,以及Windows構建/安裝指令的Readme-Windows.rdoc。
如果您陷入困境,或者只是想談論某些東西,還有一個Google+組和一個郵件列表。
如果您想作為簽名的寶石安裝,則可以在存儲庫的certs目錄中找到寶石簽名的公共證書。
PG可以選擇在Ruby或本機C代碼中鍵入鑄件值和查詢參數。這可以加快往返數據庫的數據傳輸,因為字符串分配減少,並且可以省略(較慢)Ruby代碼中的轉換。
非常基本的類型鑄件可以通過:
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的類型鑄件是高度可定制的。這就是為什麼將其分為兩層的原因:
這是較低的一層,包含編碼類,可將Ruby對象轉換為DBMS和解碼類,以將接收到的數據轉換回Ruby對象。這些課程是根據PG :: Textencoder,PG :: TextDecoder,PG :: BinaryEncoder和PG :: BinaryDecoder在PG :: textencoder中的格式和方向命名的。
可以分配類型OID,格式代碼(文本或二進制),並選擇為編碼器或解碼器對象的名稱。也可以通過分配元素編碼器/解碼器來構建複合類型。 PG ::編碼器對象可用於設置PG :: Typemap或其他方式將單個值轉換為/從其字符串表示。
以下PostgreSQL列類型由Ruby-PG(TE = Text Encoder,TD =文本解碼器,BE =二進制編碼器,BD =二進制解碼器)支持:
以下文本和二進制格式也可以編碼,儘管它們不被用作列類型:
一個Typemap定義將通過哪個編碼器/解碼器轉換哪些值。有不同類型的地圖策略,該類別的幾個派生實現。可以根據類型鑄造的特定需求選擇和配置它們。默認類型映射是PG :: TypeMapallStrings。
可以分別每個連接或每個結果集分配類型映射。類型地圖也可以用於復制進出數據流。請參閱pg ::連接#copy_data。
可用以下基本類型地圖:
以下類型地圖預先填充來自PG :: BasictyPereGistry的類型映射:
PG是線程安全的,以使不同線程可以同時使用不同的PG ::連接對象。但是,從多個線程同時訪問任何PG對像是不安全的。因此,請確保為每個新線程打開新的數據庫服務器連接,或使用以線程安全方式管理連接的包裝庫。
如果將以下消息打印到STDERR,則您可能使用幾個線程的一個連接:
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上的支撐上。Scheduler可以在Ruby-3.1或更新的地方使用。所有可能阻止IO操作的操作都通過Fiber.scheduler路由。Scheduler如果為運行線程註冊了一個。這就是為什麼PG在內部使用異步LIBPQ接口,甚至用於同步/阻止方法調用。它還使用Ruby的DNS分辨率,而不是LIBPQ的內置功能。
內部PG始終使用libpq的非塊連接模式。然後,它的行為就像在阻止模式下運行,但可以確保,所有阻止IO均通過可能的註冊Fiber.scheduler在Ruby中處理。當調用PG::Connection.setnonblocking(true)時,非阻止狀態保持啟用,但是禁用阻止狀態的其他處理,以便調用程序必須自行處理阻止狀態。
此規則的例外是使用外部庫(例如GSSAPI身份驗證) PG::Connection#lo_create大型對象的方法。它們與Fiber.scheduler不兼容。Scheduler,因此阻止狀態不會傳遞給註冊的IO調度程序。這意味著該操作將正常工作,但是IO等待狀態不能用於切換到另一個使用IO的光纖。
PG與自PG-1.5.0以來Ruby-3.0中引入的Ractor完全兼容。如果Ractor.make_shareable將所有類型的EN/解碼器和類型地圖都可以共享。還可以共享冷凍的PG :: result和PG ::元組對象。所有冷凍對象(PG ::連接除外)仍然可用於與PostgreSQL Server進行通信或讀取檢索到的數據。
PG ::連接不可共享,必須在每個Ractor中創建以建立專用連接。
要報告錯誤,建議功能或使用git查看源,請查看項目頁面。
檢查源後,安裝所有依賴項:
$ bundle install
清理擴展文件,包裝文件,測試數據庫。運行此操作以在PostgreSQL版本之間進行更改:
$ rake clean
編譯擴展:
$ rake compile
在pg_config --bindir指向:
$ rake test
或在特定的PostgreSQL版本上運行每個文件和行號的特定測試:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
生成API文檔:
$ rake docs
確保通過測試驗證所有錯誤和新功能。
目前的維護者是Michael Granger [email protected]和Lars Kanis [email protected]。
作者版權(c)1997-2022。
您可以根據Ruby本身相同的條款重新分配此軟件;請參閱https://www.ruby-lang.org/en/about/license.txt或源中的BSDL文件以獲取詳細信息。
代碼的部分來自PostgreSQL項目,並根據文件Postgres中包含的PostgreSQL許可證的條款分發。
部分版權所有Laika,Inc。
有關多年來為該圖書館做出貢獻的許多其他優秀人員,請參見貢獻者。
我們感謝Ruby-List和Ruby-Dev郵件列表中的人們。以及開發後Ql的人。