タグ:Ruby ( 4 ) タグの人気記事

ruby dbi とRDBMS

rubyとdbiで勉強して(あそんで)いる、このごろ。

require 'dbi'
dbh = DBI.connect("dbi:pg:test:localhost","user","password")
row = dbh.select_one( "select * from hoge" )
row.each{|col|
puts col.class
}
でDB側とrubyとでデータ型の関連を調べてみた。
postgvresqlは
int → fixnum
decimal → bigdecmal
varchar → string
float → float
double → float
rubyのfloatはdoubleと同精度。
postgresqlのdecimalがbigdecimalに紐付けられているのは好感がもてる。

mysqlも同様な結果。

ところがoracleは
number(10,2)をFLOATで返してくる。これはまずいんじゃないかな。
ODBC経由にするとnumber型がすべてBigdecimal型で返ってくる。
ORACLEのFLOAT、REALはいずれもstring型。

mssqlもODBC経由なら
int → Fixnum
decimal → bigdecimal
float,real → float

やっぱりORACLEが一番くせが強いかな?
[PR]
by nora1962 | 2009-04-14 05:56 | PC

rubyのsplitではまる

仕事でEXCELから出力したタブ区切りのファイルをWEBシステムにアップロードするというやつをやった。
ところが、出力ファイルの行末のタブの数が行によって違っていて、エラーになって取り込めない。
ruby使って以下のようにやってみた。
io = open(ARGV[0])
line=nil
while line=io.gets
  line.chomp!
  s = line.split(/\t/)
  print line
  print( "\t" * ( ARGV[1] - s.length ) )
  puts
end
ところがこれじゃうまく動かない。タブの数が余計に出力される。
なぜだかわからず、結構悩んでしまった。

これはsplitの仕様のせい。
"A\tB".split → [ "A", "B" ]
"A\t\tB".split → [ "A","", "B" ]
だが
"A\t\t".split → [ "A" ]
となってしまうのが原因。空文字と区切り文字が後続する部分は切り捨てられてしまう。

念のためPerl5.8で試したみたところ同様の動作を行ってた。
うーん、個人的には"A\t\t".split → [ "A" ,"",""]になってくれたほうがうれしい気がするのだが。

今回は
io = open(ARGV[0])
line=nil
while line=io.gets
  line.chomp!
  s = line.split(/\t/)
  print s,join("\t")
  print( "\t" * ( ARGV[1] - s.length ) )
  puts
end

で逃げた。
[PR]
by nora1962 | 2009-04-14 05:03 | PC

rubyで[BUG] Segmentation fault その後

ruby-pg-0.7.9.2008.10.13をVISTA環境でコンパイルするとDBIで使用できずに、[BUG] Segmentation faultが表示されて落ちる件のその後。

環境はVISTA SP1、VISUAL C++ 2008。

ためしにもう一台もっているPC( XP Pro )でVISUAL C++ 6.0でコンパイルしたpg.soを
「C:\ruby\lib\ruby\site_ruby\1.8\i386-msvcrt」にコピーしてみた。

ビンゴ!

DBIが動く。
ちなみにVISUAL C++ 2005でコンパイルしたpg.soではだめだった。

しかしVISUAL C++ 6.0 もうサポート終了だし、VISTAにインストールしようとすると「互換性」なんちゃらかちゃっらのメッセージが出てくる。正常にインストールできないみたいだ。

Ruby本体をOneClickInstaller版使っているのが悪いのかね。

しかし、Ruby本体をVisual C++ 2008でコンパイルする気にはさすがにならない。
とりあえず、Rubyの学習が目的なので現状でよしとする。
[PR]
by nora1962 | 2009-03-29 01:33 | PC

rubyで[BUG] Segmentation fault

rubyを始めた。
とりあえず勉強中。

データベース連携をしたいので、MYsql/rubyとruby-pgをインストールしてRUBY/DBIの環境を作ろうとした。
rubyはruby-186-26.exeのone-click-installer版
MYSQLはVer5.0.37
>gem install mysql --no-rdoc
>gem install dbd-mysql
で何とか入ったみたいだ。
「[ruby]Ruby/DBIでMySQLドライバを使うとSegmentation faultになる」という情報があるが、今のところ
大丈夫そう。

問題はruby-pg
「http://kamoland.com/wiki/wiki.cgi?Ruby1.9%A4%AB%A4%E9DBI%A4%C7PostgreSQL%A4%CB%C0%DC%C2%B3」
にそって
* ruby-pg-0.7.9.2008.10.13.tar.gz
* ruby-pg用パッチ - fileruby-pg-0.7.9_pg.c.patch
* dbd-pg-0.3.7.tar.gz
* dbi-0.4.1.tar.gz
を入手

C:\ruby\lib\ruby\1.8\i386-mswin32\config.h
の頭を編集
#if _MSC_VER != 1200
 ↓
#if _MSC_VER < 1200
それと
C:\ruby\lib\ruby\1.8\i386-mswin32\rbconfig.rb

CONFIG["DLDFLAGS"] の「-debug」を「-release」に
CONFIG["LIBRUBY_A"]を「=""」にして

tar zxf ruby-pg-0.7.9.2008.10.13.tar.gz
cd ruby-pg\ext
patch pg.c < ruby-pg-0.7.9_pg.c.patch
ruby extconf.rb
nmake
mt.exe -manifest pg.so.manifest -outputresource:pg.so;2
nmake install

DBD:Pgをインストール

tar zxf dbd-pg-0.3.7.tar.gz
cd dbd-pg-0.3.7
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install

DBIをインストール

tar zxf dbi-0.4.1.tar.gz
cd dbi-0.4.1
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install

ところが問題が二つ
require 'pg'
conn = PGconn.connect("localhost",5432,"","","postgres","root","xxx")

とやっても

require 'dbi'
conn = DBI.connect("dbi:pg:postgres:localhost","root","xxx")

とやっても「[BUG] Segmentation fault」が表示され停止してしまうそれもVISTAだけXP Proは問題な
く動いてくれるのだ。
何故だー!


ちなみに
require 'pg'
conn = PGconn.connect("host=localhost dbname=postgres user=root password=xxx")

だと問題なく動いてくれる。
とりあえず、postgresでruby/dbiはVISTAでは無理っぽい。

 
[PR]
by nora1962 | 2009-03-21 23:15 | PC