PG - это интерфейс Ruby к RDBMS PostgreSQL. Он работает с 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, но они не регулярно тестируются.
Мы помечаем и выпускаем драгоценные камни в соответствии с принципом семантического выпуска.
В результате этой политики вы можете (и должны) указать зависимость от этого драгоценного камня, используя ограничение пессимистической версии с двумя цифрами точности.
Например:
spec . add_dependency 'pg' , '~> 1.0' Установите через Rubygems:
gem install pg
Вам может потребоваться указать путь к программе «PG_CONFIG», установленной с Postgres:
gem install pg -- --with-pg-config=<path to pg_config>
Если вы устанавливаете через Bundler, вы можете предоставить подсказки компиляции, как это:
bundle config build.pg --with-pg-config=<path to pg_config>
См. Readme-OS_X.RDOC для получения дополнительной информации об установке под MacOS X и readme-windows.rdoc для инструкций по сборке/установке Windows.
Есть также группа 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 очень настраивается. Вот почему он разделен на 2 слоя:
Это нижний слой, содержащий классы кодирования, которые преобразуют предметы Ruby для передачи в СУБД и классы декодирования для преобразования полученных данных в объекты Ruby. Классы размещены в соответствии с их форматом и направлением в PG :: Textencoder, PG :: TextDecoder, PG :: BinaryEncoder и PG :: BinaryDecoder.
Можно присвоить тип OID, код формата (текст или двоичный) и, необязательно, имени Encoder или объекту декодера. Также возможно построить композитные типы, назначив энкодер/декодер элемента. Объекты PG :: Coder могут использоваться для настройки PG :: Typemap или альтернативы для преобразования отдельных значений в/из их строкового представления.
Следующие типы столбцов PostgreSQL поддерживаются с помощью Ruby-PG (te = текстовый энкодер, td = текстовый декодер, be = двоичный энкодер, bd = двоичный декодер):
Следующий текст и двоичные форматы также могут быть закодированы, хотя они не используются в качестве типа столбца:
Тарифная карта определяет, какое значение будет преобразовано с помощью какого кодера/декодера. Существуют разные стратегии карты типа, реализованные несколькими производными этого класса. Они могут быть выбраны и настроены в соответствии с конкретными потребностями в литью типа. Карта типа по умолчанию - pg :: typemapallstrings.
Карта типа может быть назначена для подключения или на запрос соответственно на набор результатов. Карты типа также могут использоваться для копирования и потоковой передачи данных. См. PG :: Connection#copy_data.
Доступны следующие карты базовых типов:
Следующие карты типа предварительно заполнены отображками типа из PG :: BasicTyperegistry:
PG безопасен потоком таким образом, что разные потоки могут использовать различные объекты PG :: Connection одновременно. Однако не безопасно доступ к любым объектам PG одновременно из более чем одного потока. Поэтому обязательно откройте новое соединение сервера баз данных для каждого нового потока или используйте библиотеку обертки, такую как Activerecord, которая управляет подключениями безопасным образом.
Если сообщения, подобные следующему, напечатаны в 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 полностью совместим с Fiber.scheduler , введенным в Ruby-3.0 с PG-1.3.0. В Windows поддержка Fiber.scheduler доступна на Ruby-3.1 или новее. Все, возможно, блокирующие операции ввода -вывода направляются через Fiber.scheduler , если кто -то зарегистрирован для потока. Вот почему PG внутренне использует асинхронный интерфейс LIBPQ даже для вызовов метода синхронного/блокировки. Он также использует разрешение DNS от Ruby вместо встроенных функций Libpq.
Внутренне PG всегда использует режим неблокирующего соединения Libpq. Затем он ведет себя как запуск в режиме блокировки, но гарантирует, что все блокирующие вводителя обрабатываются в Ruby через возможно зарегистрированное Fiber.scheduler . Когда PG::Connection.setnonblocking(true) называется, тогда неблокирующее состояние остается включенным, но дополнительная обработка состояний блокировки отключена, так что вызовая программа должна обрабатывать блокирующие состояния самостоятельно.
Исключением из этого правила являются методы для больших объектов, таких как PG::Connection#lo_create и методы аутентификации с использованием внешних библиотек (например, аутентификация GSSAPI). Они не совместимы с Fiber.scheduler , поэтому блокирующие состояния не передаются в зарегистрированный планировщик IO. Это означает, что операция будет работать должным образом, но состояния ожидания ввода времени не могут быть использованы для перехода на другое волокно, выполняющее io.
PG полностью совместим с Ractor, введенным в Ruby-3.0 с PG-1.5.0. Все типы EN/декодеры и карты типов являются общими между ракторами, если они сделаны заморожены Ractor.make_shareable . Также замороженные pg :: result и pg :: Объекты кортежей могут быть переданы. Все замороженные объекты (кроме PG :: Connection) все еще могут использоваться для общения с сервером PostgreSQL или для чтения полученных данных.
PG :: Соединение не является общим и должно быть создано в каждом ракторе, чтобы установить выделенное соединение.
Чтобы сообщить об ошибках, предложить функции или проверить источник с помощью GIT, ознакомьтесь с страницей проекта.
После проверки источника установите все зависимости:
$ bundle install
Файлы расширения очистки, файлы упаковки, тестовые базы данных. Запустите это, чтобы измениться между версиями PostgreSQL:
$ rake clean
Расширение компиляции:
$ rake compile
Запустите тесты/спецификации на версии PostgreSQL, которая указывает на: 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
Убедитесь, что все ошибки и новые функции подтверждаются тестами.
Нынешние сопровождающие-это Майкл Грейнджер [email protected] и Lars Kanis [email protected].
Авторские права (C) 1997-2022 годы авторами.
Вы можете перераспределить это программное обеспечение в соответствии с теми же терминами, что и сам Ruby; См. https://www.ruby-lang.org/en/about/license.txt или файл BSDL в источнике.
Части кода взяты из проекта PostgreSQL и распределены в соответствии с условиями лицензии PostgreSQL, включенной в файл Postgres.
Порции Copyright Laika, Inc.
См. Antormors.rdoc для многих дополнительных прекрасных людей, которые внесли свой вклад в эту библиотеку на протяжении многих лет.
Мы благодарны людям в списках рассылки Ruby-List и Ruby-Dev. И людям, которые развили PostgreSQL.