« iKnow! : Brain Speed! | トップページ | Mac de Ruby on Rails - #7 - Oracleと遊ぶ #6 »

2008年2月27日 (水)

Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5

Ruby on RailsでOracleとそこそこ遊べる環境構築もそろそろ終盤。
今回は、Ruby on RailsでOracle11g R1のデータベースをアクセスする簡単なアプリケーションを作ってみる。
尚、アプリケーションで利用する表は事前に作成しておいた。(Oracleにアクセスできることが確認できれば十分なので)


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4

まず事前に、emp表を元にemps表を作り、数件データを追加しておきます。

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 24 15:55:07 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> conn scott/tiger@lampeye
接続されました。
SQL> create table emps as select * from emp;

表が作成されました。

SQL> alter table emps rename column empno to id;

表が変更されました。

SQL> alter table emps add constraint emp_pk primary key (id);

表が変更されました。

SQL> create sequence emps_seq;

順序が作成されました。

SQL> insert into emps(id,ename) values(8888,'ヌルポ');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> set linesize 132
SQL> set pagesize 1000
SQL> select * from emps order by id;

ID ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
8888 ヌルポ
9999 ほげ ENGINEER 7566 08-01-01 2500 20

14行が選択されました。

SQL> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
pb17:˜ discus$
pb17:˜ discus$

次にOracleデータベースを利用するプロジェクトを作成します。
-d オプションを付けるとOracle向け構成ファイル:databaase.ymlを生成してくれます。

pb17:˜ discus$ cd /Volumes/Repository
pb17:˜ discus$
pb17:/Volumes/Repository discus$ rails -h
Usage: /opt/local/bin/rails /path/to/your/app [options]

Options:
-r, --ruby=path Path to the Ruby binary of your choice (otherwise scripts use env, dispatchers current path).
Default: /opt/local/bin/ruby
-d, --database=name Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite2/sqlite3).
Default: mysql
-f, --freeze Freeze Rails in vendor/rails from the gems generating the skeleton
Default: false

・・・・中略・・・・

Example:
rails ˜/Code/Ruby/weblog

This generates a skeletal Rails installation in ˜/Code/Ruby/weblog.
See the README in the newly created application to get going.

今回は、employee_listというプロジェクトを作ります。(コードとディレクトリーが自動的い生成されていく・・・)
database.ymlを環境の合わせ変更!

pb17:/Volumes/Repository discus$ rails -d oracle employee_list
create
create app/controllers
create app/helpers
create app/models

・・・・中略・・・・

create log/server.log
create log/production.log
create log/development.log
create log/test.log
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$ cd employee_list/config
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository/employee_list/config discus$ vi database.yml
pb17:/Volumes/Repository/employee_list/config discus$ cat database.yml
# Oracle/OCI 8i, 9, 10g
#
# Requires Ruby/OCI8:
# http://rubyforge.org/projects/ruby-oci8/
#
# Specify your database using any valid connection syntax, such as a
# tnsnames.ora service name, or a sql connect url string of the form:
#
# //host:[port][/service name]
#
# By default prefetch_rows (OCI_ATTR_PREFETCH_ROWS) is set to 100. And
# until true bind variables are supported, cursor_sharing is set by default
# to 'similar'. Both can be changed in the configation below; the defaults
# are equivalent to specifying:
#
# prefetch_rows: 100
# cursor_sharing: similar
#

development:
adapter: oracle
database: lampeye
username: scott
password: tiger

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: oracle
database: lampeye
username: test
password: tiger

production:
adapter: oracle
database: lampeye
username: prod
password: tiger
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$

ここまでできたら、emps表を操作、表示するためのscaffold(足場)を生成する。(あれまあ、簡単にできるんだなぁ)

pb17:/Volumes/Repository/employee_list/config discus$ cd ..
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp
exists app/models/
exists app/controllers/
exists app/helpers/

・・・・中略・・・・

create app/controllers/emps_controller.rb
create test/functional/emps_controller_test.rb
create app/helpers/emps_helper.rb
route map.resources :emps
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

ではテスト用サーバを起動して確認!

pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:10:11] INFO WEBrick 1.3.1
[2008-02-24 16:10:11] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:10:11] INFO WEBrick::HTTPServer#start: pid=683 port=3000
127.0.0.1 - - [24/Feb/2008:16:10:31 JST] "GET / HTTP/1.1" 200 7557
- -> /
127.0.0.1 - - [24/Feb/2008:16:10:32 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/ -> /favicon.ico

・・・・中略・・・・

127.0.0.1 - - [24/Feb/2008:16:11:35 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
^C[2008-02-24 16:12:35] INFO going to shutdown ...
[2008-02-24 16:12:35] INFO WEBrick::HTTPServer#start done.

あれ〜〜、表の中身が表示されていない? なんで〜〜〜〜!

3

調べてみると、Ruby on Rails 2.xでは、scaffoldの使い方に違いがあるからということが理由とのこと。
ということでrailsのscaffold利用方法をを参照
/opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/USAGE


では早速、作り直してみる。

pb17:/Volumes/Repository/employee_list discus$ 
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp ename:string job:string mgr:integer hiredate:date sal:integer
exists app/models/
exists app/controllers/

・・・・中略・・・・

exists test/functional/
exists test/unit/
overwrite app/views/emps/index.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/index.html.erb
overwrite app/views/emps/show.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/show.html.erb
overwrite app/views/emps/new.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/new.html.erb
overwrite app/views/emps/edit.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/edit.html.erb
identical app/views/layouts/emps.html.erb

・・・・中略・・・・

skip test/fixtures/emps.yml
exists db/migrate
Another migration is already named create_emps: db/migrate/001_create_emps.rb
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:15:40] INFO WEBrick 1.3.1
[2008-02-24 16:15:40] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:15:40] INFO WEBrick::HTTPServer#start: pid=696 port=3000
127.0.0.1 - - [24/Feb/2008:16:15:56 JST] "GET /emps HTTP/1.1" 200 12543
- -> /emps
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/emps -> /favicon.ico
^C[2008-02-24 16:17:22] INFO going to shutdown ...
[2008-02-24 16:17:22] INFO WEBrick::HTTPServer#start done.
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

お〜〜〜〜、できた〜! 

4

次回いよいよ、Ruby on RailsとOracleでそこそこ遊べる環境作りの最終回。日付の表示が気に入らないので少々コードを変更してみる。

|

トラックバック


この記事へのトラックバック一覧です: Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5:

コメント

コメントを書く