PG는 PostgreSQL RDBMS의 Ruby 인터페이스입니다. 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
Postgres와 함께 설치된 'PG_CONFIG'프로그램의 경로를 지정해야 할 수도 있습니다.
gem install pg -- --with-pg-config=<path to pg_config>
Bundler를 통해 설치하는 경우 다음과 같은 컴파일 힌트를 제공 할 수 있습니다.
bundle config build.pg --with-pg-config=<path to pg_config>
Windows 빌드/설치 지침을 위해 MacOS X 및 ReadMe-Windows.rdoc에 대한 자세한 내용은 readme-os_x.rdoc을 참조하십시오.
갇혀 있거나 무언가에 대해 채팅하고 싶다면 Google+ 그룹과 메일 링리스트도 있습니다.
서명 된 보석으로 설치하려면 보석 서명자의 공개 Certs는 저장소의 certs 디렉토리에서 찾을 수 있습니다.
PG는 Ruby 또는 Native C 코드에 캐스트 결과 값 및 쿼리 매개 변수를 선택적으로 입력 할 수 있습니다. 문자열 할당이 줄어들고 (느린) 루비 코드의 변환이 생략 될 수 있기 때문에 데이터베이스로의 데이터 전송 속도를 높일 수 있습니다.
매우 기본적인 유형 캐스팅은 다음과 같이 활성화 할 수 있습니다.
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 개의 레이어로 나뉘어져 있습니다.
이것은 DBMS 로의 전송을 위해 루비 객체를 변환하고 수신 된 데이터를 루비 객체로 변환하기 위해 디코딩 클래스를 변환하는 인코딩 클래스를 포함하는 하단 계층입니다. 클래스는 pg :: textEncoder, pg :: textDecoder, pg :: binaryencoder 및 pg :: binarydecoder의 형식과 방향에 따라 네임 스패닝됩니다.
유형 OID, 형식 코드 (텍스트 또는 이진) 및 선택적으로 이름을 인코더 또는 디코더 개체에 할당 할 수 있습니다. 요소 인코더/디코더를 할당하여 복합 유형을 빌드 할 수도 있습니다. PG :: 코더 객체를 사용하여 PG :: TypEMap을 설정하거나 단일 값을 문자열 표현으로/로 변환하는 데 사용될 수 있습니다.
다음 PostgreSQL 열 유형은 Ruby-PG (TE = Text Encoder, TD = Text Decoder, Be = Binary Encoder, BD = Binary Decoder)에 의해 지원됩니다.
다음 텍스트 및 이진 형식은 열 유형으로 사용되지 않더라도 인코딩 할 수도 있습니다.
TypEMap은 인코더/디코더로 변환 될 값을 정의합니다. 이 클래스의 여러 파생물에 의해 구현되는 다른 유형 맵 전략이 있습니다. 유형 주조에 대한 특정 요구에 따라 선택하고 구성 할 수 있습니다. 기본 유형 맵은 pg :: typemapallstrings입니다.
유형 맵은 연결 당 또는 결과 세트 당 각각 쿼리 당 할당 할 수 있습니다. 유형지도는 복사 및 출력 데이터 스트리밍에도 사용할 수 있습니다. PG :: Connection#Copy_Data를 참조하십시오.
다음과 같은 기본 유형 맵을 사용할 수 있습니다.
다음 유형의 맵은 pg :: Basictyperegistry의 유형 매핑으로 미리 채워집니다.
PG는 다른 스레드가 다른 pg :: 연결 객체를 동시에 사용할 수 있도록 스레드 안전합니다. 그러나 둘 이상의 스레드에서 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는 PG-1.3.0 이후 Ruby-3.0에 도입 된 Fiber.scheduler 과 완전히 호환됩니다. Windows에서 Fiber.scheduler 에 대한 지원은 Ruby-3.1 또는 최신에서 사용할 수 있습니다. IO 작업을 차단할 수있는 모든 IO 작업은 실행중인 스레드에 등록 된 경우 Fiber.scheduler 통해 라우팅됩니다. 그렇기 때문에 PG는 내부적으로 동기/차단 메소드 호출에도 비동기 LIBPQ 인터페이스를 사용하는 이유입니다. 또한 LIBPQ의 내장 기능 대신 Ruby의 DNS 해상도를 사용합니다.
내부적으로 PG는 항상 LIBPQ의 비 차단 연결 모드를 사용합니다. 그런 다음 차단 모드에서 실행되는 것처럼 동작하지만 모든 차단 IO가 등록 된 Fiber.scheduler 통해 루비에서 처리되도록합니다. PG::Connection.setnonblocking(true) 이 호출되면 비 블로킹 상태는 활성화되었지만 차단 상태의 추가 처리가 비활성화되어 호출 프로그램이 자체적으로 차단 상태를 처리해야합니다.
이 규칙의 예외는 PG::Connection#lo_create 와 같은 대형 개체의 방법과 외부 라이브러리를 사용하는 인증 방법 (GSSAPI 인증)과 같은 방법입니다. 이들은 Fiber.scheduler 와 호환되지 않으므로 차단 상태가 등록 된 IO 스케줄러로 전달되지 않습니다. 즉, 작업이 제대로 작동하지만 IO 대기 상태는 IO를 수행하는 다른 섬유로 전환 할 수 없습니다.
PG는 PG-1.5.0 이후 Ruby-3.0에 도입 된 Ractor와 완전히 호환됩니다. Ractor.make_shareable 에 의해 동결 된 경우 모든 유형 EN/디코더 및 유형 맵은 actors간에 공유 할 수 있습니다. 또한 냉동 PG :: 결과 및 pg :: 튜플 객체를 공유 할 수 있습니다. 모든 냉동 된 객체 (pg :: Connection 제외)는 여전히 PostgreSQL 서버와 통신하거나 검색된 데이터를 읽는 데 사용될 수 있습니다.
PG :: 연결이 공유되지 않으며 전용 연결을 설정하려면 각 ractor 내에서 생성되어야합니다.
버그를보고하려면 GIT로 소스를 확인하거나 소스를 확인하려면 프로젝트 페이지를 확인하십시오.
소스를 확인한 후 모든 종속성을 설치합니다.
$ bundle install
확장 파일 정리, 포장 파일, 테스트 데이터베이스. PostgreSQL 버전간에 변경하려면 다음을 실행하십시오.
$ rake clean
컴파일 확장 :
$ rake compile
pg_config --bindir 가리키는 PostgreSQL 버전에서 테스트/사양을 실행하십시오.
$ rake test
또는 특정 PostgreSQL 버전에서 파일 당 특정 테스트 및 줄 번호를 실행하십시오.
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
API 문서 생성 :
$ rake docs
모든 버그와 새로운 기능이 테스트에 의해 검증되어 있는지 확인하십시오.
현재 관리자는 Michael Granger [email protected] 및 Lars kanis [email protected]입니다.
저자의 저작권 (C) 1997-2022.
루비 자체와 동일한 용어 로이 소프트웨어를 재분배 할 수 있습니다. 자세한 내용은 https://www.ruby-lang.org/en/about/license.txt 또는 bsdl 파일을 참조하십시오.
코드의 일부는 PostgreSQL 프로젝트에서 나 왔으며 PostgreSQL 라이센스의 조건에 따라 Postgres에 포함됩니다.
일부 저작권 Laika, Inc.
수년 동안이 도서관에 기여한 많은 추가 훌륭한 사람들에 대해서는 Contributors.rdoc을 참조하십시오.
우리는 Ruby-List 및 Ruby-Dev 메일 링리스트의 사람들에게 감사합니다. 그리고 PostgreSQL을 개발 한 사람들에게.