Rails 2.1.0 の rake db:create と db:drop

前に、Windowsで(PostgreSQLのクライアントコマンドを入れてないと)、リモートDBサーバに対して、rake db:create がエラーになると書いた(rake db:create と createdb.bat - Rubyとか Illustratorとか SFとか折紙とか)
その後 InstantRails の 2.1.0 では DB作れた(http://d.hatena.ne.jp/hs9587/20080605/1212664481)。
で、ちょっと見てみたら、InstantRails環境だからというのではなく、2.1.0 の機能として実現されている模様。
\lib\ruby\gems\1.8\gems\rails-2.1.0\lib\tasks\databases.rake を見ると、ActiveRecord::Base.establish_connection とか ActiveRecord::Base.connection.create_database と言っている。

      when 'postgresql'
        @encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
        begin
          ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
          ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
          ActiveRecord::Base.establish_connection(config)
        rescue
          $stderr.puts $!, *($!.backtrace)
          $stderr.puts "Couldn't create database for #{config.inspect}"
        end

ActiveRecord が拡張されたという事でいいのかな。


(その日のうちに追記)
ActiveRecord のメソッドは 2.0.2 でもあった(当たり前ですね、establish_connection出来なきゃそもそも O/Rマッパーにならない)。
だから、今回 rakeタスクがきちんと定義されたという事になるのでしょう。

db:drop の問題

db:create はいいのだけど、db:drop の方は、「DROP DATABASE [ IF EXISTS ] name」構文を使ってるので、8.2.0以降ということになる。8.1系以前では、rake db:drop はエラーになる。

syntax error at or near "EXISTS"

Debian stable (etch) の PostgreSQLパッケージが 8.1系までなのがちょっとだけつらい。