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的人。