Tuesday, April 15, 2008

Rails-ийг Oracle-тай холбох нь

Нэлээдгүй өндөр ачаалалд, яг таг ажиллах ёстой веб програм хийх хэрэгцээ гарсан тул богино хугацаанд, чанартайхан бүтээл гаргаж болохоор хөгжүүлэлтийн хөрс сонгох хэрэгтэй боллоо. RoR-ийн талаар өмнө сонирхож, номны ганц хоёр хуудас эргүүлснээс бус амьдралд хэрэглэгдсэн бодьтой зүйл хийж байсангүй. Ямартай ч мундаг динамик боломжтой Ruby хэлээр, convention over configuration паттерныг барьж хийсэн, сүүлийн үед хүчээ авч яваа хөгжүүлэлтийн суурь юмаа гэдгийг гадарлаж байгаам.

Үүссэн Rails програмыг Oracle баазтай холбох гээд хагас өдөр зарцуулчихсан тул эндээс мэдсэн зүйлээ хэрэгтэй хүнд нь хөтөч болгон бичиж үлдээх нь зүйтэй гэж үзлээ. Таныг аль хэдүйн баазаа тохируулж, rails програмынхаа скелетоныг үүсгэсэн гэж бодож байна. Бидний тохиолдолд баазыг өөр машинд суулгасан. Алдарт scott/tiger-ийн баазыг жишээгээр авлаа.

Шаардлагатай багцууд:
  1. ruby-oci8, Oracle баазтай холбогдох ruby интерфэйс
  2. activerecord-oracle-adapter
  3. Oracle instant client
Багцуудыг суулгах нь:
  1. ruby-oci8
    Виндовз хэрэглэгчид ruby-oci8-1.0.0-mswin32.rb файлыг татаж аваарай. Доорхи байдлаар хялбархан сууж байна:

    C:\>ruby ruby-oci8-1.0.0-mswin32.rb
    Copy OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8
    Copy oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8
    Copy oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
    OK?
    Enter Yes/No: yes
    Copying OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8 ... done
    Copying oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8 ... done
    Copying oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt ... done
    OK
    C:\>

  2. activerecord-oracle-adapter
    Oracle адаптерийг gem ашиглан суулгах нь хялбар аж:

    C:\>gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
    Bulk updating Gem source index for: http://gems.rubyonrails.org/
    Bulk updating Gem source index for: http://gems.rubyonrails.org/
    Successfully installed activerecord-oracle-adapter-1.0.0.9216
    1 gem installed
    C:\>

  3. Oracle instant client
    Татсан програмаа хаа нэг эвтэйхэн газар задлаж орхи. Эндээс oci.dll, oraociei11.dll файлуудыг хайж олоод Windows\System хавтаст хуулна. Хамаг цагаа үүнийг мэдээгүйгээс барсан байгаам. За тэр болоод өнгөрч, одоо Ruby интерфэйс бэлэн болсон байх учиртай, шалгаж үзье:

    C:\>ruby -r oci8 -e "OCI8.new('scott', 'tiger','//<db-host-address>:1521/<sid>').exec('select * from emp') do |r| puts r.join(','); end"

    7369,SMITH,CLERK,7902,1980/12/17 00:00:00,800.0,,20
    7499,ALLEN,SALESMAN,7698,1981/02/20 00:00:00,1600.0,300.0,30
    7521,WARD,SALESMAN,7698,1981/02/22 00:00:00,1250.0,500.0,30
    7566,JONES,MANAGER,7839,1981/04/02 00:00:00,2975.0,,20
    7654,MARTIN,SALESMAN,7698,1981/09/28 00:00:00,1250.0,1400.0,30
    C:\>
    Yes!!!, хэвийн ажиллаж байна.


database.yml
Oracleтай холбогдох интерфэйсүүд бэлэн болсон тул, одоо веб програмынхаа баазын тохиргоог хийе. Дараахи байдлаар хийхэд хангалттай:
config/database.yml
# Oracleтай холбох нь.
development:
    adapter: oracle
    database: <db-host-address>/<sid>
    username: scott
    password: tiger

Одоо веб програмаа эхлүүлээд, браузерт нээвэл дараахи мэдээлэл гарч байх учиртай:


Бүх зүйл хэвийн, иймд emp нэртэй баазын модель үүсгэе:
ruby script\generate model emp
Rails баазад маань emps нэртэй хүснэгт байгаа гэж автоматаар ойлгоно. Гэтэл scott-ийн баазад emp нэртэй л хүснэгт байгаа шүү дэ? emp моделийг emps бус emp хүснэгттэй яаж уях вэ? Дараахи байдлаар хүснэгийн нэрийг дахин тодорхойлж болно:
app/model/emp.rb
class Emp < ActiveRecord::Base
    set_table_name "scott.emp"
end

Үүний дараагаар index хуудас(action) үзүүлэх scott нэртэй контроллёр үүсгэе:
ruby script\generate controller scott index

index хуудсанд emp хүснэгтийн мэдээллийг харуулъя. Ингэхийн тулд scott_controller-ийг дараахи байдлаар бичээд үз:
app/controllers/scott_controller.rb
class ScottController < ApplicationController
    def index
        @emps = Emp.find(:all)
    end
end

Одоо presentation layer буюу татсан мэдээллээ дэлгэцэнд байршуулах index файлыг боловсруулъя:
app/views/scott/index.rhtml
<h3>Ажилчид</h3>
<table border="1">
  <tr>
    <%names = Array.new;
      Emp.column_names.each{ |name| names << name;
    %>
      <%="<th>#{name}</th>"%>
    <%}%>
  </tr>
  <%for emp in @emps%>
  <tr>
    <%for name in names%>
      <td><%=eval("emp.#{name}")%> </td>
    <%end%>
  </tr>
  <%end%>
</table>

Одоо хийсэн ажлаа шалгая. Броузерт: http://127.0.0.1:3000/scott гэж бичээд үзнэ үү. Доорхитой ижил үр дүн гарч байна уу?

За ингээд бид зорьсондоо хүрлээ. Доорхи линкүүд танд хэрэг болж юу магад вэ, гүйлгээд харна биз:

Нэмэлт:
config/environment.rb файлд
ENV['NLS_LANG']='american_america.AL32UTF8'
мөрийг нэмж өгөөрэй. Одоо Oracle-аас монгол(UTF-8) текстүүд асуудалгүй татагдах болно.

5 comments:

Badka said...

That's quiet new for me.

Ochko said...

Good job!

Unknown said...

Бас л хэрэг болох эд байна. Rails - тай найзлахаараа эргэж тухтай үзнээ.

Саагий said...

.dll үүдийн байрлаж байсан замыг нь виндовсын PATH д нэмээд өгчихвөл дараа дараагийн удаад амар байж бас мэдэх л юм

Battur Sanchin said...

TO: Sagi

Neeren tiim baina.