PG est l'interface rubis des RDB PostgreSQL. Il fonctionne avec PostgreSQL 10 et plus tard.
Un petit exemple d'utilisation:
#!/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 

Il fonctionne généralement avec des versions antérieures de Ruby / Postgresql également, mais celles-ci ne sont pas régulièrement testées.
Nous tagons et publions des gemmes selon le principe du versioning sémantique.
À la suite de cette politique, vous pouvez (et devriez) spécifier une dépendance à ce joyau en utilisant la contrainte de version pessimiste avec deux chiffres de précision.
Par exemple:
spec . add_dependency 'pg' , '~> 1.0' Installer via RubyGems:
gem install pg
Vous devrez peut-être spécifier le chemin du programme vers le programme 'pg_config' installé avec Postgres:
gem install pg -- --with-pg-config=<path to pg_config>
Si vous installez via Bundler, vous pouvez fournir des conseils de compilation comme tel:
bundle config build.pg --with-pg-config=<path to pg_config>
Voir ReadMe-OS_X.RDOC pour plus d'informations sur l'installation sous MacOS X, et ReadMe-Windows.rdoc pour les instructions Windows Build / Installation.
Il y a aussi un groupe Google+ et une liste de diffusion si vous êtes coincé, ou si vous voulez simplement discuter de quelque chose.
Si vous souhaitez installer en tant que bijou signé, les certificats publics des signataires de gemmes peuvent être trouvés dans le répertoire certs du référentiel.
PG peut éventuellement taper les valeurs de résultat coulé et les paramètres de requête dans le code C Ruby ou natif. Cela peut accélérer les transferts de données vers et depuis la base de données, car les allocations de chaîne sont réduites et les conversions dans le code Ruby (plus lent) peuvent être omises.
La coulée de type très basique peut être activée par:
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}"]]Mais le casting de type de PG est hautement personnalisable. C'est pourquoi il est divisé en 2 couches:
Il s'agit de la couche inférieure, contenant des classes d'encodage qui convertissent les objets Ruby pour la transmission en SGBD et les classes de décodage pour convertir les données reçues en objets Ruby. Les classes sont compliquées en fonction de leur format et de leur direction dans PG :: TextEncoder, PG :: TextDeccoder, PG :: BinaryEncoder et Pg :: BinaryDeccoder.
Il est possible d'attribuer un type OID, du code de format (texte ou binaire) et éventuellement un nom à un codeur ou un objet de décodeur. Il est également possible de créer des types composites en attribuant un codeur / décodeur d'élément. Les objets PG :: Coders peuvent être utilisés pour configurer un PG :: TYPEMAP ou alternativement pour convertir des valeurs uniques en / depuis leur représentation de chaîne.
Les types de colonnes postgresql suivants sont pris en charge par Ruby-PG (Te = Encodeur de texte, TD = décodeur de texte, BE = Encodeur binaire, BD = décodeur binaire):
Le texte suivant et les formats binaires peuvent également être codés bien qu'ils ne soient pas utilisés comme type de colonne:
Un typemap définit quelle valeur sera convertie par quel codeur / décodeur. Il existe différentes stratégies de carte de type, mises en œuvre par plusieurs dérivations de cette classe. Ils peuvent être choisis et configurés en fonction des besoins particuliers de coulée de type. La carte de type par défaut est pg :: tymapallStrings.
Une carte de type peut être attribuée respectivement par connexion ou par requête par ensemble de résultats. Les cartes de type peuvent également être utilisées pour copier et sortir le streaming de données. Voir PG :: Connexion # COPY_DATA.
Les cartes de type de base suivantes sont disponibles:
Les cartes de type suivantes sont préremplies avec des mappages de types du PG :: BasicTypeRegistry:
PG est sécurisé par le fil de telle manière que différents threads peuvent utiliser différents objets PG :: Connexion simultanément. Cependant, il n'est pas sûr d'accéder à des objets PG simultanément à partir de plusieurs threads. Assurez-vous donc d'ouvrir une nouvelle connexion de serveur de base de données pour chaque nouveau thread ou d'utiliser une bibliothèque de wrapper comme ActiveRecord qui gère les connexions de manière sûre.
Si des messages comme les éléments suivants sont imprimés sur stderr, vous utilisez probablement une connexion à partir de plusieurs 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
PG est entièrement compatible avec Fiber.scheduler introduite dans Ruby-3.0 depuis PG-1.3.0. Sur Windows, la prise en charge de Fiber.scheduler est disponible sur Ruby-3.1 ou plus récent. Toutes les opérations IO bloquent peut-être le déroulement de la Fiber.scheduler si l'on est inscrit au fil en cours. C'est pourquoi PG utilise en interne l'interface libpq asynchrone même pour les appels de méthode synchrone / blocage. Il utilise également la résolution DNS de Ruby au lieu des fonctions intégrées de LiBPQ.
PG en interne utilise toujours le mode de connexion non bloquante de LiBPQ. Il se comporte alors comme la course en mode de blocage mais garantit que tout le blocage IO est manipulé dans Ruby via une Fiber.scheduler éventuellement enregistrée.Scheduler. Lorsque PG::Connection.setnonblocking(true) est appelé, l'état non bloquant reste activé, mais la gestion supplémentaire des états de blocage est désactivée, de sorte que le programme d'appel doit gérer seul les états de blocage.
Une exception à cette règle est les méthodes de grands objets comme PG::Connection#lo_create et les méthodes d'authentification à l'aide de bibliothèques externes (comme l'authentification GSSAPI). Ils ne sont pas compatibles avec Fiber.scheduler , afin que les états de blocage ne soient pas transmis au planificateur IO enregistré. Cela signifie que l'opération fonctionnera correctement, mais les états d'attente IO ne peuvent pas être utilisés pour passer à une autre fibre faisant IO.
PG est entièrement compatible avec le ractor introduit dans Ruby-3.0 depuis PG-1.5.0. Tous les types de / décodeurs et cartes de type sont partageables entre les ractors s'ils sont fabriqués congelés par Ractor.make_shareable . Aussi congelé PG :: Résultat et PG :: Les objets Tuple peuvent être partagés. Tous les objets gelés (sauf la connexion PG ::) peuvent toujours être utilisés pour effectuer une communication avec le serveur PostgreSQL ou pour lire les données récupérées.
PG :: La connexion n'est pas partageable et doit être créée au sein de chaque Ractor pour établir une connexion dédiée.
Pour signaler des bogues, suggérer des fonctionnalités ou consulter la source avec GIT, consultez la page du projet.
Après avoir vérifié la source, installez toutes les dépendances:
$ bundle install
Fichiers d'extension de nettoyage, fichiers d'emballage, bases de données de test. Exécutez ceci pour changer entre les versions PostgreSQL:
$ rake clean
Extension de compilation:
$ rake compile
Exécutez des tests / spécifications sur la version PostgreSQL que pg_config --bindir pointe vers:
$ rake test
Ou exécutez un test spécifique par fichier et numéro de ligne sur une version postgresql spécifique:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
Générer la documentation de l'API:
$ rake docs
Assurez-vous que tous les bogues et les nouvelles fonctionnalités sont vérifiés par des tests.
Les responsables actuels sont Michael Granger [email protected] et Lars Kanis [email protected].
Copyright (C) 1997-2022 par les auteurs.
Vous pouvez redistribuer ce logiciel dans les mêmes termes que Ruby lui-même; Voir https://www.ruby-lang.org/en/about/license.txt ou le fichier BSDL dans la source pour plus de détails.
Des parties du code proviennent du projet PostgreSQL et sont distribuées en vertu des termes de la licence PostgreSQL, incluse dans le fichier Postgres.
Portions Copyright Laika, Inc.
Voir contributeurs.rdoc pour les nombreuses belles personnes supplémentaires qui ont contribué à cette bibliothèque au fil des ans.
Nous sommes reconnaissants envers les gens de la liste Ruby-List et Ruby-DEV. Et aux personnes qui ont développé PostgreSQL.