Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] (Interface) Ruby – pg

[OpenSQL] (Interface) Ruby – pg

Pg개요

Pg란?

Pg is the Ruby interface to the PostgreSQL RDBMS.
It works with PostgreSQL 9.3 and later.

– Pg 공식 github –

Pg는 Ruby 프로그래밍 언어를 위한 PostgreSQL 클라이언트 라이브러리 입니다.
Thread Safety를 지원하며, 각각의 Thread는 서로 다른 Connection 객체를 사용할 수 있지만, 안정성을 위해서는 Thread마다 각자의 연결을 사용하는 것을 권하고 있습니다.

추가적인 쓰레드 안정성 확보를 위해서 Active Record 라이브러리 사용을 권장하고 있습니다.

Active Record란?
소프트웨어 아키텍쳐 패턴으로, 데이터베이스의 데이터에 액세스하는 방식입니다. 이 패턴에서 데이터베이스의 테이블, 뷰와 같은 오브젝트는 클래스로 Wrapping 됩니다. Wrapper 클래스는 테이블 또는 뷰의 각 열(Column)에 대한 접근자 메소드 또는 속성을 구현합니다. 객체 인스턴스는 테이블의 단일 행(Row)에 연결되어, 객체를 새로 만들고 저장하면 객체가 클래스에 랩핑된 테이블 또는 뷰의 새로운 Row가 됩니다. 마찬가지로, 객체가 업데이트 되면 테이블의 해당 Row도 업데이트 됩니다.

지원 기능

  • Type Casts (Ruby 코드 내에서 Query 파라미터의 데이터 타입 캐스팅이 가능합니다.)
  • Ruby와 DBMS의 통신시에 Ruby 객체와 데이터베이스 데이터를 인코딩 및 디코딩할 수 있도록 BE(Binary Encoder), BD(Binary Decoder), TE(Text Encoder), TD(Text Decoder)가 지원됩니다.
  • Thread Safety를 지원합니다.
  • Pg는 libpq의 nonblocking mode를 사용하여, Fiber IO Scheduler를 지원합니다.
  • Ractor와 호환 되어 Ractor간에 인코더/디코더, 튜플 등의 고정객체를 공유할 수 있습니다.

Pg-Ruby 버전 호환성 확인

Pg-Ruby의 공식 매뉴얼에는 아래와 같은 버전 이상의 Ruby, PostgreSQL을 지원한다고 되어있습니다.
이 범위에 벗어나는 버전도, 사용은 가능하지만 Pg-Ruby를 릴리즈 할 때 테스트가 진행되지 않으므로 이슈가 발생해도 해결하기 어렵습니다.

Ruby 버전2.5 이상
PostgreSQL 버전9.3.x 이상

Pg-Ruby 다운로드

Pg-Ruby는 Ruby의 gem 패키지 매니저를 이용하면 쉽게 설치할 수 있습니다.
PostgreSQL 클라이언트 및 개발 패키지를 사용하다 보니, 설치 환경이 다를 수 있어서 아래의 명령어를 이용해서 pg_config의 디렉토리를 지정해줍니다.

gem install pg

#또는

gem install pg — –with-pg-config=

Pg-Ruby 설치

Linux(CentOS7) 와 Windows 10 두 환경에서 설치를 해보도록 하겠습니다.
Ruby Language가 설치되어 있지 않다면, 아래의 링크를 참조하여 설치해주시기 바랍니다.
https://www.ruby-lang.org/en/downloads/

Linux (CentOS 7)에 설치

설치 시 필요한 패키지 목록

postgresql-14.2 기준

  • Ruby 3.0.2 (CentOS 7 scl-rh Repository 기준 최신 버전 )

실습 환경은 Ruby를 아래와 같이 설치하도록 하겠습니다.

Ruby 설치

1.Ruby Language 다운로드
CentOS SCL-RH Repository에서 다운로드 받기 위해 Repository를 설치합니다.

#yum install centos-release-scl-rh

2.Ruby3.0.2 및 개발패키지를 설치합니다.

yum install rh-ruby30 rh-ruby30-ruby-devel

3.Ruby를 사용하기 위해 실습을 진행할 유저의 환경변수를 설정합니다.

$ vi ~/.bash_profile

# 가장 하단에 아래 내용 추가
export PATH=$PATH:/opt/rh/rh-ruby30/root/bin
export LD_LIBRARY_PATH=$LD_LIBRARAY_PATH:/opt/rh/rh-ruby30/root/lib:/opt/rh/rh-ruby30/root/lib64

4.설치가 잘 되었는지 확인합니다.

$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]

Pg-Ruby 설치

1.gem을 이용하여 Pg-Ruby를 설치합니다.
OpenSQL for PostgreSQL 표준 설치 기준이며, include lib 디렉토리가 다르다면 변경 해주셔야 합니다.

gem install pg — –with-pg-include=/usr/pgsql-14/include –with-pg-lib=/usr/pgsql-14/lib
Building native extensions with: ‘–with-pg-include=/usr/pgsql-14/include –with-pg-lib=/usr/pgsql-14/lib’
This could take a while…
Successfully installed pg-1.5.3
Parsing documentation for pg-1.5.3
Installing ri documentation for pg-1.5.3
Done installing documentation for pg after 5 seconds
1 gem installed

2.Pg-Ruby가 잘 설치되었는지 확인합니다.
gem list를 이용하여 확인할 수 있습니다.

#gem list –local | grep pg

pg (1.5.3)

Windows 10 (64-bit)에 설치

추가 예정

Pg-Ruby사용방법

Pg-Ruby 사용방법 – Linux(CentOS 7)

사용방법 실습 환경
아래와 같은 환경에서 PGX를 사용 해보는 실습을 진행하겠습니다.

OSCentOS 7.9
PostgreSQL VersionPostgreSQL 14.2
Ruby VersionGO 1.20.4
Pg-Ruby Version1.5.3

사용방법 실습 순서

1. 실습에 필요한 테스트 코드 파일을 생성합니다.
테스트 코드가 담긴 rubyTest.rb 파일을 생성 하겠습니다.

#!/usr/bin/env ruby

require ‘pg’

#Output a table of current connections to the DB

conn = PG.connect( host: ‘127.0.0.1’, port: ‘5432’, dbname: ‘postgres’, user: ‘postgres’ )
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

2. 테스트 파일을 실행합니다.

$ ruby rubyTest.rb

아래와 같이 pg_stat_activity 카탈로그에서 세션 정보들을 읽어온 결과가 출력됩니다.

PID | User | Query
17700 | |
17703 | postgres |
27396 | postgres | SELECT * FROM pg_stat_activity
17698 | |
17701 | |
17697 | |
17699 | |

Pg-Ruby 사용 방법 – Windows 10

추가예정

오류가 발생 한다면?

연결 오류

/opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:819:in connect_start’: could not connect to server: No such file or directory (PG::ConnectionBad) Is the server running locally and accepting connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”? from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:819:in connect_to_hosts’ from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:759:in new’ from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg.rb:63:in connect’ from rubyTest.rb:6:in `<main>’

오류가 발생해요!

답변 내용

PostgreSQL 서버에 접속이 불가능 한 상태입니다!

1. PostgreSQL 서버 기동 상태를 확인합니다.

  • PostgreSQL 데이터베이스 서버가 기동되어 있지 않다면 접속이 불가능합니다.
  • 기동이 되어 있다면 postgresql.conf와 postgresql.auto.conf의 listen_addresses 파라미터를 확인해주세요.

2. Host와 Port를 한번 더 확인 해주시기 바랍니다.

  • Host와 Port가 잘못 입력 되어서 입력 받은 접속 정보로 연결이 불가능 할 경우 위와 같은 메시지가 출력됩니다.

3. PostgreSQL 서버의 방화벽을 확인합니다.

  • 접속을 시도하는 서버가 PostgreSQL 서버의 방화벽에 막히지 않는지 방화벽 설정을 확인 해주시기 바랍니다.

/opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:696:in async_connect_or_reset’: FATAL: no pg_hba.conf entry for host “127.0.0.1”, user “postgres”, database “postgres”, no encryption (PG::ConnectionBad) from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:824:in connect_to_hosts’ from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg/connection.rb:759:in new’ from /opt/rh/rh-ruby30/root/usr/local/share/gems/gems/pg-1.5.3/lib/pg.rb:63:in connect’ from rubyTest.rb:6:in `<main>’

오류가 발생해요!

답변 내용

PostgreSQL의 pg_hba.conf에 연결 허용 설정이 되어있지 않아서 그렇습니다! pg_hba.conf에 접속 정보를 추가 해주세요!
아래는 TCP 연결을 통해 192.168.123.123 호스트로 부터 온 연결 요청에 대해서 모든 데이터베이스 및 모든 유저로 접속이 가능하고 패스워드는 입력하지 않아도 접속이 가능 하도록 설정하는 예시 입니다.

TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.123.123/32 trust

PG-Ruby 에 대한 더욱 자세한 정보는 아래의 ruby-pg github를 확인 해주시기 바랍니다.
https://github.com/ged/ruby-pg

지금까지 ‘PostgreSQL (Interface) Ruby – pg’에 관해 알아보았습니다

‘PostgreSQL Contrib Extensions – Function part1’를 바로 이어서 확인해보세요!


광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •