PG é a interface Ruby para o PostgreSQL RDBMS. Funciona com o PostgreSQL 10 e posterior.
Um pequeno exemplo de uso:
#!/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 

Geralmente funciona com versões anteriores do Ruby/PostgreSQL também, mas elas não são testadas regularmente.
Marcamos e lançamos gemas de acordo com o princípio de versão semântica.
Como resultado dessa política, você pode (e deve) especificar uma dependência dessa gema usando a restrição de versão pessimista com dois dígitos de precisão.
Por exemplo:
spec . add_dependency 'pg' , '~> 1.0' Instale via Rubygems:
gem install pg
Pode ser necessário especificar o caminho para o programa 'PG_CONFIG' instalado com o PostGres:
gem install pg -- --with-pg-config=<path to pg_config>
Se você estiver instalando via Bundler, pode fornecer dicas de compilação como assim:
bundle config build.pg --with-pg-config=<path to pg_config>
Consulte ReadMe-os_x.rdoc para obter mais informações sobre a instalação no MacOS X e readme-windows.rdoc para instruções de construção/instalação do Windows.
Há também um grupo do Google+ e uma lista de discussão se você ficar preso, ou apenas quiser conversar sobre algo.
Se você deseja instalar como uma jóia assinada, os certificados públicos dos assinantes da GEM podem ser encontrados no diretório certs do repositório.
O PG pode opcionalmente digitar valores de resultado do CAST e parâmetros de consulta no código C Ruby ou Native. Isso pode acelerar as transferências de dados de e para o banco de dados, porque as alocações de string são reduzidas e as conversões no código do rubi (mais lento) podem ser omitidas.
A fundição do tipo muito básica pode ser ativada por:
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}"]]Mas a fundição do tipo PG é altamente personalizável. É por isso que está dividido em 2 camadas:
Esta é a camada inferior, contendo classes de codificação que convertem objetos de rubi para transmissão nas classes DBMS e decodificação para converter dados recebidos de volta aos objetos Ruby. As classes são nomes de acordo com seu formato e direção em PG :: TextEncoder, PG :: TextDecoder, PG :: BinaryEncoder e Pg :: BinaryDecoder.
É possível atribuir um tipo OID, código de formato (texto ou binário) e, opcionalmente, um nome a um codificador ou objeto decodificador. Também é possível criar tipos compostos atribuindo um codificador/decodificador de elemento. PG :: Objetos do codificador podem ser usados para configurar um PG :: TypeMap ou alternativamente para converter valores únicos para/a partir de sua representação de string.
Os seguintes tipos de coluna PostGresql são suportados pelo ruby-pg (te = codificador de texto, td = decodificador de texto, be = codificador binário, bd = decodificador binário):
Os seguintes formatos de texto e binário também podem ser codificados, embora não sejam usados como tipo de coluna:
Um TypeMap define qual valor será convertido pelo qual o codificador/decodificador. Existem diferentes estratégias de mapa de tipo, implementadas por várias derivações desta classe. Eles podem ser escolhidos e configurados de acordo com as necessidades específicas de fundição de tipo. O mapa do tipo padrão é PG :: TypeMapallStrings.
Um mapa de tipos pode ser atribuído por conexão ou por consulta, respectivamente, por conjunto de resultados. Os mapas de tipo também podem ser usados para cópia dentro e fora do streaming de dados. Consulte PG :: Conexão#copy_data.
Os seguintes mapas de tipo de base estão disponíveis:
Os seguintes mapas de tipo são preenchidos com mapeamentos de tipo do PG :: Basictyperegistry:
PG é seguro de thread de forma que diferentes threads possam usar diferentes objetos de conexão PG :: Conexão simultaneamente. No entanto, não é seguro acessar objetos PG simultaneamente a partir de mais de um thread. Portanto, abra uma nova conexão do servidor de banco de dados para cada novo thread ou use uma biblioteca de wrapper como o ActiveRecord que gerencia conexões de maneira segura.
Se mensagens como as seguintes forem impressas no Stderr, você provavelmente estará usando uma conexão de vários threads:
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
O PG é totalmente compatível com Fiber.scheduler introduzido no Ruby-3.0 desde o PG-1.3.0. No suporte do Windows para Fiber.scheduler está disponível no Ruby-3.1 ou mais recente. Todas as operações de IO possivelmente são roteadas através da Fiber.scheduler se for registrado para o thread em execução. É por isso que o PG usa internamente a interface LIBPQ assíncrona, mesmo para chamadas de método síncrono/de bloqueio. Ele também usa a resolução DNS da Ruby em vez das funções incorporadas da LibPQ.
Internamente, o PG sempre usa o modo de conexão não bloqueador do libpq. Em seguida, ele se comporta como correr no modo de bloqueio, mas garante que todo o bloqueio de IO seja tratado em Ruby através de uma Fiber.scheduler possivelmente registrada.Scheduler. Quando PG::Connection.setnonblocking(true) é chamado, o estado não bloqueador permanece ativado, mas o manuseio adicional de estados de bloqueio é desativado, para que o programa de chamada precise lidar com os estados bloqueadores por conta própria.
Uma exceção a esta regra são os métodos para objetos grandes, como PG::Connection#lo_create e métodos de autenticação usando bibliotecas externas (como a autenticação GSSAPI). Eles não são compatíveis com Fiber.scheduler , para que os estados de bloqueio não sejam passados para o agendador de IO registrado. Isso significa que a operação funcionará corretamente, mas os estados de espera de IO não podem ser usados para mudar para outra fibra fazendo IO.
O PG é totalmente compatível com o Ractor introduzido no Ruby-3.0 desde o PG-1.5.0. Todos os tipos EN/Decoders e Type Maps são compartilháveis entre os ractores se forem feitos congelados por Ractor.make_shareable . Também PG :: Resultado e PG :: Objetos de tupla podem ser compartilhados. Todos os objetos congelados (exceto PG :: Connection) ainda podem ser usados para comunicar -se com o servidor postgreSQL ou para ler dados recuperados.
PG :: A conexão não é compartilhável e deve ser criada dentro de cada rator para estabelecer uma conexão dedicada.
Para relatar bugs, sugira recursos ou confira a fonte com o Git, consulte a página do projeto.
Depois de verificar a fonte, instale todas as dependências:
$ bundle install
Arquivos de extensão de limpeza, arquivos de embalagem, bancos de dados de teste. Execute isso para mudar entre as versões do PostGresql:
$ rake clean
Extensão compilar:
$ rake compile
Execute testes/especificações na versão PostGresql que pg_config --bindir aponta para:
$ rake test
Ou execute um teste específico por arquivo e número da linha em uma versão específica do PostGresql:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
Gerar a documentação da API:
$ rake docs
Certifique -se de que todos os bugs e novos recursos sejam verificados por testes.
Os mantenedores atuais são Michael Granger [email protected] e Lars kanis [email protected].
Copyright (c) 1997-2022 pelos autores.
Você pode redistribuir este software nos mesmos termos que o próprio Ruby; Consulte https://www.ruby-lang.org/en/about/license.txt ou o arquivo BSDL na fonte para obter detalhes.
Partes do código são do projeto PostgreSQL e são distribuídas nos termos da licença PostgreSQL, incluídas no arquivo Postgres.
Partes Copyright Laika, Inc.
Consulte os colaboradores.rdoc para muitas pessoas adicionais que contribuíram para esta biblioteca ao longo dos anos.
Somos gratos às pessoas nas listas de correspondência Ruby-List e Ruby-Dev. E para as pessoas que desenvolveram PostgreSQL.