Ruby 드라이버

CUBRID Ruby 드라이버는 Ruby로 작성한 응용 프로그램에서 CUBRID 데이터베이스를 사용할 수 있게 하는 드라이버로, RubyGem 패키지 형태로 제공된다.

CUBRID Ruby 드라이버는 CCI API를 기반으로 작성되었으므로, CCI API 및 CCI에 적용되는 CCI_DEFAULT_AUTOCOMMIT 과 같은 설정 파라미터에 영향을 받는다.

Ruby 설치 및 설정

기본 환경

  • Ruby 1.8.7 이상

  • CUBRID gem

  • ActiveRecord gem

Linux

gem 을 사용하여 CUBRID Connector를 설치할 수 있다. 다음과 같이 sudo 명령어에 -E 옵션을 사용하여 sudo 명령어가 CUBRID 데이터베이스 설치 경로 환경 변수를 변경하지 않도록 해야 한다.

sudo -E gem install cubrid

Windows

다음 명령어를 실행하여 최신 버전의 CUBRID Ruby 드라이버를 설치한다.

gem install cubrid

Ruby 예제 프로그램

여기에서는 Ruby로 CUBRID 데이터베이스에 대한 작업을 수행하는 예제 프로그램을 작성한다. 예제로 다음과 같이 테이블을 생성한다.

CREATE TABLE countries(
    id INTEGER AUTO_INCREMENT,
    code CHARACTER VARYING(3) NOT NULL UNIQUE,
    name CHARACTER VARYING(40) NOT NULL UNIQUE,
    record_date DATETIME DEFAULT SYSDATETIME NOT NULL,
    CONSTRAINT pk_countries_id PRIMARY KEY(id)
);

CREATE TABLE cities(
    id INTEGER AUTO_INCREMENT NOT NULL UNIQUE,
    name CHARACTER VARYING(40) NOT NULL,
    country_id INTEGER NOT NULL,
    record_date DATETIME DEFAULT SYSDATETIME NOT NULL,
    FOREIGN KEY (country_id) REFERENCES countries(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT pk_cities_id PRIMARY KEY(id)
);

라이브러리 로드

예제 프로그램으로 tutorial.rb 라는 파일을 생성하고 다음과 같은 기본 설정을 작성한다.

require 'rubygems'
require 'active_record'
require 'pp'

데이터베이스 연결

다음과 같이 파라미터를 정의하여 데이터베이스 연결을 생성한다.

ActiveRecord::Base.establish_connection(
 :adapter => "cubrid",
 :host => "localhost",
 :database => "demodb" ,
 :user => "dba"
)

데이터베이스에 객체 삽입

테이블을 조작하기 전에 테이블을 ActiveRecord의 클래스와 매핑해야 한다.

class Country < ActiveRecord::Base
end

class City < ActiveRecord::Base
end

Country.create(:code => 'ROU', :name => 'Romania')
Country.create(:code => 'HUN', :name => 'Hungary')
Country.create(:code => 'DEU', :name => 'Germany')
Country.create(:code => 'FRA', :name => 'France')
Country.create(:code => 'ITA', :name => 'Italy', :record_date => Time.now)
Country.create(:code => 'SPN', :name => 'Spain')

데이터베이스에서 레코드 조회

다음과 같이 데이터베이스에서 레코드를 조회한다.

romania = Country.find(1)
pp(romania)

romania = Country.where(:code => 'ROU')
pp(romania)

Country.find_each do |country|
 pp(country)
end

데이터베이스 레코드 갱신

여기에서는 다음과 같이 Spaincode‘SPN’ 에서 ‘ESP’ 로 변경한다.

Country.transaction do
 spain = Country.where(:code => 'SPN')[0]
 spain.code = 'ESP'
 spain.save
end

데이터베이스 레코드 삭제

데이터베이스의 레코드를 삭제하는 코드는 다음과 같다.

Country.transaction do
 spain = Country.where(:code => 'ESP')[0]
 spain.destroy
end

연관(association)을 이용한 작업

국가에 도시를 추가하는 방법 중 하나는 Country 를 조회하여 Countrycode 를 새로운 City 객체에 할당하는 것이다.

romania = Country.where(:code => 'ROU')[0]
City.create(:country_id => romania.id, :name => 'Bucharest');

더 좋은 방법은 다음과 같이 ActiveRecord에 관계를 알리고 이를 Country 클래스에 선언하는 것이다.

class Country < ActiveRecord::Base
 has_many :cities, :dependent => :destroy
end

class City < ActiveRecord::Base
end

위 코드에 따라 한 국가는 여러 개의 도시를 가질 수 있다. 이제 다음과 같이 간단하게 국가에 새 도시를 추가할 수 있다. 이 방법을 사용하면 도시에 접근할 때 참조되는 국가의 모든 도시들을 얻을 수 있으므로 유용하게 사용할 수 있다.

italy = Country.where(:code => 'ITA')[0]
italy.cities.create(:name => 'Milano');
italy.cities.create(:name => 'Napoli');

pp (romania.cities)
pp (italy.cities)

또한 다음과 같은 코드로 국가를 삭제하면 그 국가의 모든 도시가 삭제된다.

romania.destroy

ActiveRecord 는 일대일이나 다대다(many-to-many)와 같은 관계도 지원한다.

메타데이터 관리

ActiveRecord를 사용하면 코드를 수정하지 않아도 다른 데이터베이스를 사용할 수 있다.

데이터베이스 구조 정의

ActiveRecord::Schema.define 을 사용하여 새 테이블을 정의할 수 있다. 예를 들면 다음과 같이 일대다(one-to-many)로 대응되는 책에 대한 테이블(books)과 저자에 대한 테이블(authors)을 생성할 수 있다.

ActiveRecord::Schema.define do
 create_table :books do |table|
  table.column :title, :string, :null => false
  table.column :price, :float, :null => false
  table.column :author_id, :integer, :null => false
 end

 create_table :authors do |table|
  table.column :name, :string, :null => false
  table.column :address, :string
  table.column :phone, :string
 end

 add_index :books, :author_id
end

CUBRID에서 지원하는 칼럼 타입은 :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :boolean, :bit, :smallint, :bigint, :char 이다. 현재 :binary 는 지원하지 않는다.

테이블 칼럼 관리

ActiveRecord::Migration 의 기능을 사용하여 테이블의 칼럼을 추가하거나 업데이트, 삭제할 수 있다.

ActiveRecord::Schema.define do
 create_table :todos do |table|
  table.column :title, :string
  table.column :description, :string
 end

 change_column :todos, :description, :string, :null => false
 add_column :todos, :created, :datetime, :default => Time.now
 rename_column :todos, :created, :record_date
 remove_column :todos, :record_date

end

데이터베이스 스키마 덤프

ActiveRecord::SchemaDumper.dump 를 사용하여 현재 사용 중인 스키마의 정보를 덤프할 수 있다. 덤프된 스키마 정보는 플랫폼과 상관없이 사용할 수 있는 형식으로 저장되며 Ruby ActiveRecord에서도 사용할 수 있다.

단, :bigint, :bit 등과 같이 특정 데이터베이스에서 사용되는 커스텀 칼럼 타입을 사용한다면 제대로 동작하지 않을 수 있다.

서버 용량 정보 획득

현재 연결에서 다음과 같이 데이터베이스 정보를 획득할 수 있다.

puts "Maximum column length        : " + ActiveRecord::Base.connection.column_name_length.to_s
puts "SQL statement maximum length : " + ActiveRecord::Base.connection.sql_query_length.to_s
puts "Quoting : '''test'''         : " + ActiveRecord::Base.connection.quote("'''test'''")

데이터베이스 생성

CUBRID에서는 데이터베이스 생성을 cubrid create 유틸리티 명령어로만 처리하기 때문에, 프로그램 내에서는 데이터베이스를 생성할 수 없다.

ActiveRecord::Schema.define do
 create_database('not_supported')
end