プロフィール

けい

Author:けい
公開したWebサービス・アプリ一覧はこちら

※2014年12月、私が個人で開発したWebサービス・アプリへの
累計アクセス数は8億を超えました。
負荷対策頑張ります。日々精進していきます!!


■■■ 業務経歴 ■■■
社会人1年目:携帯電話開発。画面周りを1年間
2年目 :海外向け携帯電話ミドルウェア開発
     ブラウザとプロトコルスタック周り
2年目後半~:携帯電話の通信専用チップ開発
3年目:カーナビ。画面周りの開発
3年目後半~:BDビデオカメラ
     組み込みLinux カーネルと
     ドライバの開発。
4年目12月:プロジェクト途中で退社
~ここまではC、またはC++で開発~

~ここからJavaがメインの開発~
4年目1月:Web系の会社に転職
       ~4ヶ月間の研修
5年目5月:製造業向け生産管理システム開発
6年目9月:証券会社向けシステム開発
7年目10月~携帯電話向けコミックサイトの運用・開発
8年目12月:プロジェクト途中で退社

~ここからPHPがメインの開発~
8年目1月~仲介手数料が無料の不動産屋の社内SEに転職
交渉しほぼ完全に裁量労働が可能な立場になる。
業務内容はシステム全般ですが、
最近はSEO対策の作業が多いです。
現在14年目 まだ、しばらくはこの会社に居るつもりです。

あと、全ての記事がリンクフリーです。

最近の記事

過去ログ

全ての記事を表示する

全ての記事を表示する

カテゴリー

FC2カウンター

RSSフィード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.--    [ Myカテゴリ:スポンサー広告 ]

MySQL/Rubyを用いてMySQLへのデータベースアクセス

ruby からMySQL/Rubyを用いてデータベースアクセス。

rubyでデータベースアクセスする必要が出てきたので、MySQL/Rubyを試してみた。
よくよく読んで見るとMySQL/RubyはMySQL の C API をラップした形で実装しているらしく
MySQLが提供しているAPIはほとんど使用可能らしい。
以下手順

1, mysql/rubyのダウンロード
wget http://rubyforge.org/frs/download.php/29755/mysql-ruby-2.8pre1.tar.gz

2, 解凍
% tar zxvf mysql-ruby-2.8pre1.tar.gz

3, configure
% ruby extconf.rb --with-mysql-dir=/usr/lib/mysql --with-mysql-include=/usr/include/mysql

4, ビルド
% make

5, テスト
問題発生。どうやらパラメータの指定は以下らしいのだが、うまくいかない。
% ruby ./test.rb -- [hostname [user [passwd [dbname [port [socket [flag]]]]]]]
% ruby ./test.rb localhost user password dbname

実行すると以下のようなエラーが出る。
Loaded suite ./test
Started
.FE...FE.FE.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.........
Finished in 0.042105 seconds.

1) Failure:
test_connect(TC_Mysql) [./test.rb:33]:
Exception raised:
Class:
Message: <"\245\346\241\274\245\266\241\274 'user'@'localhost' \244\362\265\361\310\335\244\267\244\336\244\271.uUsing password: NO)">
---Backtrace---
./test.rb:33:in `connect'
./test.rb:33:in `test_connect'
./test.rb:33:in `test_connect'
---------------

2) Error:
test_connect2(TC_Mysql):
Mysql::Error: ユーザー 'user'@'localhost' を拒否します.uUsing password: NO)
./test.rb:90:in `connect'
./test.rb:90:in `test_connect2'

・・・こんなエラーが延々とでる。
調べてみるとパラメータがうまく渡っていないようだ。
暫定処理として、Rubyのコードに直接パラメータを書くようにした。

@host, @user, @pass, db, port, sock, flag = ARGV
@host = "localhost"
@user = "user"
@pass = "password"
@db = "dbname"
@port = 3306

% ruby ./test.rb
Loaded suite ./test
Started
..................................................................................................................
Finished in 0.105784 seconds.

114 tests, 381 assertions, 0 failures, 0 errors

OKらしい。OKなのか?
ここでエラーがでても別に次の作業で影響が出るわけではないので、
これを見ている人でtest.rbでエラーが出ている人はとっとと
次のインストール作業に進んだほうがいいです。

6, インストール
% sudo make install

7, コードを書いて実際にテストしてみる

=====================================
#!/usr/bin/ruby -Ku

require 'mysql'

my = Mysql.new("localhost", "user", "password", "DBname")
st = my.prepare("SELECT * FROM XXX WHERE XXX=DDD")
st.execute
p st.fetch
st.close
=====================================
試してみると文字化けする。
あれ?CSEだとUTF8で読み書きできるのになぁ。
以下の方法でコード上からMySQLの文字コードを取得する。

=========================================
#!/usr/bin/ruby -Ku

require 'mysql'

my = Mysql.init()
my.real_connect("localhost", "user", "password", "DBname")
p my.character_set_name()
=========================================

結果:"latin1"らしい。ああ、そうですか。そうですか。
どうやらMySQLはデフォルトではLatin-1を用いるそうです。
phpmysqladminに頼りっきりで、気がつきませんでした。
文字コードを変更するために /etc/mysql/my.cnf の[client]と
[mysqld]セクションの両方に以下の記載を追加しました。


[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8

再起動後、以下のコマンドを入力することで、確認可能です。
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (i486) using readline 5.2

Connection id: 6
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.32-Debian_7etch5-log Debian etch distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 14 sec

Threads: 1 Questions: 141 Slow queries: 0 Opens: 139 Flush tables: 1 Open tables: 21 Queries per second avg: 10.071
--------------


よし!できた。と思い、もう一度試す。
結果:"latin1" 。困ったなぁ。
MySQL/RubyのAPIを読んでいても文字コードを設定できそうな場所は、無かったので
今度はMySQLのC用APIを読んでいたら見つけた。

http://dev.mysql.com/doc/refman/5.1/ja/mysql-options.html

mysql_options()のパラメータで文字コードを設定できるらしい。
試してみる。

=========================================
#!/usr/bin/ruby -Ku

require 'mysql'

my = Mysql.init()
my.options(Mysql::SET_CHARSET_NAME, "utf8")
my.real_connect("localhost", "user", "password", "DBname")
p my.character_set_name()
=========================================

結果:utf8になりました。
そして作成したコードが以下。
無事にutf8で結果を取得+出力できました。

=========================================
#!/usr/bin/ruby -Ku

require 'mysql'

#Mysql クラスオブジェクトを取得
my = Mysql.init()

#文字コードの設定
my.options(Mysql::SET_CHARSET_NAME, "utf8")

#接続開始
my.real_connect("localhost", "user", "password", "DBname")

#SQL文の実行
st = my.prepare("SELECT * FROM TABLE ORDER BY CODE")
st.execute

#結果の行数文ループする
for i in 0...st.num_rows()
#一行取得
data = st.fetch()

#3番目のカラムのみ出力
p data[3]
end

#接続を切断する
st.close
=========================================

そして、思う。スクリプト言語って、試しながら書けるからいいですね。
やはりCやJavaでは手順が色々とからむせいもあって、待ち時間を含めてイライラすることが多い。
Rubyが楽しいプログラミングと言われるのもわかる気がしました。


スポンサーサイト
コメント(0)   2008.02.11    [ Myカテゴリ:試してみた ]

コメントの投稿













管理者にだけ表示を許可する

Template Designed By
ぐらいんだぁ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。