PG es la interfaz Ruby para el PostgreSQL RDBMS. Funciona con PostgreSQL 10 y posterior.
Un pequeño ejemplo 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 

Por lo general, también funciona con versiones anteriores de Ruby/PostgreSQL, pero no se prueban regularmente.
Etiquetamos y lanzamos gemas de acuerdo con el principio de versiones semánticas.
Como resultado de esta política, puede (y debe) especificar una dependencia de esta gema utilizando la restricción de la versión pesimista con dos dígitos de precisión.
Por ejemplo:
spec . add_dependency 'pg' , '~> 1.0' Instalar a través de Rubygems:
gem install pg
Es posible que deba especificar la ruta al programa 'PG_CONFIG' instalado con Postgres:
gem install pg -- --with-pg-config=<path to pg_config>
Si está instalando a través de Bundler, puede proporcionar sugerencias de compilación como así:
bundle config build.pg --with-pg-config=<path to pg_config>
Consulte ReadMe-OS_X.RDOC para obtener más información sobre la instalación de MacOS X y ReadMe-Windows.rdoc para las instrucciones de construcción/instalación de Windows.
También hay un grupo de Google+ y una lista de correo si se atasca, o simplemente desea chatear sobre algo.
Si desea instalar como una gema firmada, los certificadores públicos de los firmantes de GEM se pueden encontrar en el directorio certs del repositorio.
PG puede escribir opcionalmente los valores de los resultados y los parámetros de consulta en el código R Ruby o Native. Esto puede acelerar las transferencias de datos hacia y desde la base de datos, porque las asignaciones de cadenas se reducen y se pueden omitir las conversiones en el código Ruby (más lento).
Se puede habilitar la fundición de tipo muy básico 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}"]]Pero la fundición de tipo de PG es altamente personalizable. Por eso se divide en 2 capas:
Esta es la capa inferior, que contiene clases de codificación que convierten los objetos de Ruby para la transmisión a los DBMS y las clases de decodificación para convertir los datos recibidos en objetos Ruby. Las clases están atrapadas de nombres de acuerdo con su formato y dirección en PG :: TextEncoder, PG :: TextDecoder, PG :: BinaryEncoder y PG :: BinaryDecoder.
Es posible asignar un tipo de código OID, formato (texto o binario) y opcionalmente un nombre a un codificador o objeto decodificador. También es posible construir tipos compuestos asignando un codificador/decodificador de elementos. Los objetos PG :: Coder se pueden usar para configurar un PG :: TypEmap o alternativamente para convertir los valores únicos a/desde su representación de cadena.
Los siguientes tipos de columna PostgreSQL son compatibles con Ruby-PG (TE = Text Coder, TD = Text Decoder, Be = Binary Coder, BD = Binary Decoder):
El siguiente texto y los formatos binarios también se pueden codificar, aunque no se usan como tipo de columna:
Un typemap define qué valor se convertirá por qué codificador/decodificador. Existen diferentes estrategias de mapa de tipo, implementadas por varias derivaciones de esta clase. Se pueden elegir y configurar de acuerdo con las necesidades particulares para el tipo de fundición. El mapa de tipo predeterminado es PG :: TypEMapallStrings.
Se puede asignar un mapa de tipo por conexión o por consulta respectivamente por conjunto de resultados. Los mapas de tipo también se pueden usar para la transmisión de datos de entrada y salida. Ver PG :: Connection#Copy_data.
Los siguientes mapas de tipo base están disponibles:
Los siguientes mapas de tipo se preceden con mapeos de tipo de la PG :: BasicTypeRegistry:
PG es seguro de hilos de tal manera que diferentes hilos pueden usar diferentes objetos de conexión PG :: simultáneamente. Sin embargo, no es seguro acceder a ningún objeto PG simultáneamente desde más de un hilo. Por lo tanto, asegúrese de abrir una nueva conexión del servidor de base de datos para cada nuevo hilo o use una biblioteca de envoltura como Activerecord que administra las conexiones de manera segura.
Si los mensajes como los siguientes se imprimen en Stderr, probablemente esté usando una conexión de varios subprocesos:
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 es totalmente compatible con Fiber.scheduler Scheduler introducido en Ruby-3.0 desde PG-1.3.0. En el soporte de Windows para Fiber.scheduler está disponible en Ruby-3.1 o más nuevo. Todas las operaciones de Bloqueo de IO se enrutan a través de la Fiber.scheduler si uno está registrado para el hilo en ejecución. Es por eso que PG usa internamente la interfaz asíncrona de libpq incluso para llamadas de métodos sincrónicos/de bloqueo. También utiliza la resolución DNS de Ruby en lugar de las funciones construidas de LibPQ.
Internamente PG siempre usa el modo de conexión sin bloqueo de LibPQ. Luego se comporta como correr en modo de bloqueo, pero asegura que todo el bloqueo de IO se maneja en Ruby a través de una Fiber.scheduler posiblemente registrada. Cuando se llama PG::Connection.setnonblocking(true) entonces el estado sin bloqueo permanece habilitado, pero el manejo adicional de los estados de bloqueo está deshabilitado, por lo que el programa de llamadas tiene que manejar los estados de bloqueo por sí solo.
Una excepción a esta regla son los métodos para objetos grandes como PG::Connection#lo_create y métodos de autenticación utilizando bibliotecas externas (como la autenticación GSSAPI). No son compatibles con Fiber.scheduler . Eso significa que la operación funcionará correctamente, pero los estados de espera de IO no se pueden usar para cambiar a otra fibra que hace IO.
PG es totalmente compatible con Ractor introducido en Ruby-3.0 desde PG-1.5.0. Todos los tipos EN/decodificadores y mapas de tipo se pueden compartir entre los ractores si son congelados por Ractor.make_shareable . También se pueden compartir los objetos PG :: PG :: Tuple PG :: Tuple. Todos los objetos congelados (excepto PG :: Connection) aún se pueden usar para comunicarse con el servidor PostgreSQL o para leer datos recuperados.
PG :: La conexión no es compartible y debe crearse dentro de cada ractor para establecer una conexión dedicada.
Para informar errores, sugerir funciones o consulte la fuente con GIT, consulte la página del proyecto.
Después de revisar la fuente, instale todas las dependencias:
$ bundle install
Limpieza de archivos de extensión, archivos de embalaje, bases de datos de prueba. Ejecute esto para cambiar entre versiones PostgreSQL:
$ rake clean
Extensión de compilación:
$ rake compile
Ejecute pruebas/especificaciones en la versión PostgreSQL que pg_config --bindir señala:
$ rake test
O ejecute una prueba específica por archivo y número de línea en una versión específica de PostgreSQL:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
Genere la documentación de la API:
$ rake docs
Asegúrese de que todos los errores y nuevas características se verifiquen mediante pruebas.
Los mantenedores actuales son Michael Granger [email protected] y Lars Kanis [email protected].
Copyright (c) 1997-2022 por los autores.
Puede redistribuir este software en los mismos términos que Ruby; Consulte https://www.ruby-lang.org/en/about/license.txt o el archivo BSDL en la fuente para más detalles.
Las partes del código son del proyecto PostgreSQL y se distribuyen bajo los términos de la licencia PostgreSQL, incluida en el archivo Postgres.
Porciones Copyright Laika, Inc.
Ver contribuyentes.rdoc para las muchas personas finas adicionales que han contribuido a esta biblioteca a lo largo de los años.
Estamos agradecidos con las personas en las listas de correo de Ruby-List y Ruby-Dev. Y a las personas que desarrollaron PostgreSQL.