SinatraでMySQLにActiveRecordで接続するときの,はじめの一歩
ruby :1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]
gem :1.3.7
MySQL :Ver 14.14 Distrib 5.1.37, for Win32 (ia32)
sinatra :1.1.0
activerecord :1.15.6
sinatraは
#>gem install sinatra -v=1.1.0 --no-rdoc --no-ri
で,インストールした後にapp.rbで以下のソースを保存して
#app.rb
require 'sinatra'
get '/hi' do
"Hello World!"
end
#>ruby app.rb
これで,http://localhost:4567/で走ってるかチェック.
activerecordは
#>gem install activerecord -v=1.15.6 --no-rdoc --no-ri
特に,activerecordはv3.0.1が出てきて,さらにこけてくれちゃうのでもし入っている場合は,
#>gem uninstall activerecord -v=3.0.1
でおさらばします.
MySQL側の準備をします.コマンドラインからでもMySQL Admin & Query Browserでもいいです.Rubyist Magazine - RubyOnRails を使ってみる ActiveRecordを参照するのがYOI.
で,app2.rbには以下の内容を保存して
#app2.rb
require 'rubygems' # may not be needed, depending on platform
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:host => 'localhost',
:username => 'USERNAME', #or root
:password => 'PASSWORD',
:database => 'YOURDATABASE'
)
class User < ActiveRecord::Base
end
user = User.new
user.name = "bouyatetsu"
user.save
puts user.name
#>ruby app2.rb
でやっぱり走らす.坊や哲が現れたら成功.
以下注意
gem install mysqlは禁物
現在の環境に加えてmysqlのgem(v2.8.1)が入っている場合,なんかうまいこといきません.
こけた例1
app2.rbで
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-1.15.6/lib/active_record/connection_adapters/abstract_adapter.rb:128:in `log': Mysql::Error: query: not connected INSERT INTO users (`name`) VALUES(NULL) (ActiveRecord::StatementInvalid)
こけた例2
activerecordもsinatraも使ってるapp3.rb
require 'rubygems'
require 'sinatra'
require 'active_record'
class Product < ActiveRecord::Base
end
get '/' do
ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:host => 'localhost',
:username => 'root',
:password => 'supercar',
:database => 'dbss'
)
Product.find(1)
end
を走らせた場合(Webrick),スタートするけどコップから水がこぼれて
ActiveRecord::StatementInvalid at Mysql::Error: query: not connected: SELECT * FROM products WHERE (products.`id` = 1)
で,これは原因が分からないけどもこんなんも出る.
mysql_adapter.rb:287:in `query': query: not connected (Mysql::Error)
さらには,
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:196: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-24) [i386-mswin32]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
が出たときも一度mysqlのgemとactiverecordが同居してないか確かめる.