PG ist die Ruby -Schnittstelle zum PostgreSQL RDBMS. Es funktioniert mit Postgresql 10 und später.
Eine kleine Beispielverwendung:
#!/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 

Es funktioniert normalerweise auch mit früheren Versionen von Ruby/Postgresql, aber diese werden nicht regelmäßig getestet.
Wir markieren und veröffentlichen Edelsteine nach dem semantischen Versionsprinzip.
Als Ergebnis dieser Richtlinie können (und sollten) Sie eine Abhängigkeit von diesem Juwel angeben, indem Sie die pessimistische Versionsbeschränkung mit zwei Ziffern der Präzision verwenden.
Zum Beispiel:
spec . add_dependency 'pg' , '~> 1.0' Installieren Sie über Rubygemems:
gem install pg
Möglicherweise müssen Sie den Pfad zum mit Postgres installierten Programm 'pg_config' angeben:
gem install pg -- --with-pg-config=<path to pg_config>
Wenn Sie über Bundler installiert sind, können Sie Kompilierungshinweise wie SO geben:
bundle config build.pg --with-pg-config=<path to pg_config>
Weitere Informationen zur Installation unter MacOS X und readme-windows.rdoc finden Sie unter Readme-Os_x.rdoc für Windows Build/Installationsanweisungen.
Es gibt auch eine Google+ -Gruppe und eine Mailingliste, wenn Sie stecken bleiben oder nur über etwas chatten möchten.
Wenn Sie als unterschriebenes Juwel installieren möchten, finden Sie die öffentlichen Zertifikate der Gem -Unterzeichner im certs -Verzeichnis des Repositorys.
PG kann optional Guss -Ergebniswerte und Abfrageparameter im Ruby- oder nativen C -Code eingeben. Dies kann die Datenübertragungen in und von der Datenbank beschleunigen, da die Stringzuweisungen reduziert werden und der (langsamere) Ruby -Code unterbrochen werden kann.
Sehr grundlegender Typ -Casting kann aktiviert werden durch:
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}"]]Aber PGs Typ Casting ist sehr anpassbar. Deshalb ist es in 2 Schichten unterteilt:
Dies ist die untere Schicht, die Codierungsklassen enthält, die Ruby -Objekte für die Übertragung in die DBMs und Dekodierungsklassen umwandeln, um empfangene Daten in Ruby -Objekte zurückzukehren. Die Klassen werden nach ihrem Format und ihrer Richtung in pg :: textcoder, pg :: textdecoder, pg :: binarycoder und pg :: binarydecoder.
Es ist möglich, einem Encoder- oder Decoder -Objekt einen Typ OID, Formatcode (Text oder Binär) und optional einen Namen zuzuweisen. Es ist auch möglich, zusammengesetzte Typen zu erstellen, indem ein Element -Encoder/Decoder zugewiesen wird. PG :: Codiererobjekte können verwendet werden, um eine pg :: typemap oder alternativ einzurichten, um einzelne Werte in/aus ihrer String -Darstellung umzuwandeln.
Die folgenden postgresql-Spaltentypen werden von Ruby-PG (TE = Text Encoder, TD = Text Decoder, BE = Binary Encoder, BD = Binary Decoder) unterstützt:
Die folgenden Text- und Binärformate können auch codiert werden, obwohl sie nicht als Spaltentyp verwendet werden:
Eine Typemap definiert, welcher Wert durch welchen Encoder/Decoder konvertiert wird. Es gibt verschiedene Typ -Map -Strategien, die durch mehrere Ableitungen dieser Klasse implementiert werden. Sie können entsprechend den besonderen Anforderungen für Typ Casting ausgewählt und konfiguriert werden. Die Standardtypkarte ist pg :: typemapallstrings.
Eine Typkarte kann pro Verbindung oder pro Abfrage pro Ergebnissatz zugewiesen werden. Typ -Karten können auch zum Kopieren von Daten -Streaming verwendet werden. Siehe PG :: Connection#Copy_Data.
Die folgenden Basistypkarten sind verfügbar:
Die folgenden Karten werden mit Typ -Zuordnungen aus der PG :: BasicTypeGistry vorgefüllt:
PG ist so sicher, dass verschiedene Threads gleichzeitig unterschiedliche PG :: -Verbindungsobjekte verwenden können. Es ist jedoch nicht sicher, auf PG -Objekte gleichzeitig von mehr als einem Thread zuzugreifen. Öffnen Sie also eine neue Datenbankserververbindung für jeden neuen Thread oder verwenden Sie eine Wrapper -Bibliothek wie ActiveCord, die Verbindungen auf sichere Weise verwaltet.
Wenn Nachrichten wie die folgenden in Stderr gedruckt werden, verwenden Sie wahrscheinlich eine Verbindung aus mehreren 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 ist mit Fiber.scheduler vollständig kompatibel. Unter Windows-Unterstützung für Fiber.scheduler ist auf Ruby-3.1 oder neuer verfügbar. Alle möglicherweise blockierenden IO -Operationen werden durch die Fiber.scheduler geleitet. Aus diesem Grund verwendet PG intern die asynchronische LIBPQ -Schnittstelle, auch für Synchron-/Blockierungsmethodenaufrufe. Es verwendet auch Rubys DNS -Auflösung anstelle von LIBPQs gebauten Funktionen.
Intern wird PG immer den nicht blockierenden Verbindungsmodus von libpq verwendet. Es verhält sich dann wie das Laufen im Blockierungsmodus, stellt jedoch sicher, dass alle blockierenden IOs in Ruby durch eine möglicherweise registrierte Fiber.scheduler behandelt werden. Wenn PG::Connection.setnonblocking(true) bezeichnet wird, bleibt der nicht blockierende Zustand aktiviert, aber die zusätzliche Handhabung von Blockierungszuständen ist deaktiviert, sodass das Anrufprogramm für sich selbst blockierende Zustände bewältigen muss.
Eine Ausnahme von dieser Regel sind die Methoden für große Objekte wie PG::Connection#lo_create und Authentifizierungsmethoden unter Verwendung externer Bibliotheken (wie GSSAPI -Authentifizierung). Sie sind nicht mit Fiber.scheduler kompatibel, so dass Blockierungszustände nicht an den registrierten IO -Scheduler übergeben werden. Das bedeutet, dass die Operation ordnungsgemäß funktioniert, aber IO -Wartezustände können nicht verwendet werden, um zu einer anderen Faser zu wechseln.
PG ist seit PG-1.5.0 vollständig kompatibel mit Ractor, der in Ruby-3.0 eingeführt wurde. Alle Typen EN/Decoder und Typkarten können zwischen Raktoren gemeinsam genutzt werden, wenn sie von Ractor.make_shareable eingefroren werden. Auch Frozen Pg :: Ergebnis und PG :: Tuple -Objekte können geteilt werden. Alle gefrorenen Objekte (mit Ausnahme von PG :: Verbindung) können weiterhin mit dem PostgreSQL -Server kommunizieren oder abgerufene Daten lesen.
PG :: Verbindung ist nicht gemeinsam genutzt und muss in jedem Raktor erstellt werden, um eine dedizierte Verbindung herzustellen.
Um Fehler zu melden, Funktionen vorzuschlagen oder die Quelle mit Git anzusehen, lesen Sie die Projektseite.
Installieren Sie nach dem Überprüfen der Quelle alle Abhängigkeiten:
$ bundle install
Reinigungserweiterungsdateien, Verpackungsdateien, Testdatenbanken. Führen Sie dies aus, um zwischen PostgreSQL -Versionen zu ändern:
$ rake clean
Erweiterung kompilieren:
$ rake compile
Führen Sie Tests/Spezifikationen auf der PostgreSQL -Version aus, die pg_config --bindir verweist:
$ rake test
Oder führen Sie einen bestimmten Test pro Datei und Zeilennummer in einer bestimmten PostgreSQL -Version aus:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
Generieren Sie die API -Dokumentation:
$ rake docs
Stellen Sie sicher, dass alle Fehler und neuen Funktionen durch Tests überprüft werden.
Die aktuellen Besucher sind Michael Granger geda..org und Lars kanis [email protected].
Copyright (C) 1997-2022 durch die Autoren.
Sie können diese Software unter den gleichen Bedingungen wie Ruby selbst umverteilen. Weitere Informationen finden Sie unter https://www.ruby-lang.org/en/about/license.txt oder in der BSDL-Datei in der Quelle.
Teile des Code stammen aus dem PostgreSQL -Projekt und werden unter den Bestimmungen der PostgreSQL -Lizenz verteilt, die in den Datei Postgres enthalten sind.
Portions Copyright Laika, Inc.
Siehe Mitwirkende.rdoc für die vielen weiteren guten Menschen, die im Laufe der Jahre zu dieser Bibliothek beigetragen haben.
Wir sind den Leuten der Ruby-List und Ruby-Dev Mailing-Listen dankbar. Und an die Menschen, die Postgresql entwickelt haben.