簡易テーブルExport

Rails系フレームワークは、テーブルExportを作るのが楽。DB dumpでは文字化けする場合、重宝します。

レンタルサーバにありがちな悩み

データベースの文字コード設定に無頓着だと、「Webサイトではちゃんと読めるんだけど、DBダンプは文字化けする」みたいなことって、よくあると思います。

自分で全レイヤーの文字コードの制御ができる場合は問題ナイですが、特にレンタルサーバ間でデータ移行する場合がメンドくさい。
サーバAでExportしたダンプをサーバBでImportできない(文字化けする)、とか。

そんなとき、Rails系フレームワーク(O-Rマッパ)だと、簡単にExportが作れる。


例えばAkelosだと、

<?php
class ExportController extends ApplicationController{
  var $models = 'member,item,order';

  function member(){
    $this->export( $this->Member );
  }
  function item(){
    $this->export( $this->Item );
  }
  function order(){
    $this->export( $this->Order );
  }

  function export($dao){
    $table = $dao->getTableName();
    $cols = array_keys( $dao->getAttributeNames() );
    $cols_csv = implode(",",$cols);
    $sql = array();
    $results = $dao->_executeSql("SELECT * FROM {$table}");
    while ($record = $results->FetchRow()) {
      $vals = array();
      foreach( $cols as $i=>$name ){
        $vals[$i] = "'{$record[$name]}'";
      }
      $vals_csv = implode( ",", $vals );
      array_push( $sql, "insert into {$table} ({$cols_csv}) values ({$vals_csv});" );
    }
    $this->sendData( implode("\n",$sql),
      array('filename'=>"{$table}.sql",'type'=>'text/plain;charset=UTF8') );
  }
}
?>

で、http://host/export/member から、membersテーブルをExportできます。

ActiveRecordをバカ正直に使うと(もっと簡単に書けるが)、すぐにOutOfMemoryになるので、生SQLを使っています。ActiveRecordはメタデータを取得するためだけに使う。

CakePHPやSymfonyとかでも、同じ感じでできるハズです。

Railsだと、

こんな感じか。

class ExportController < ApplicationController

  def member
    export Member
  end
  def item
    export Item
  end
  def order
    export Order
  end

  def export( dao )
    table = dao.table_name
    cols = dao.new.attribute_names
    cols_csv = cols.join(',')
    sql = []
    dao.connection.select_all("SELECT * FROM #{table}").each do |record|
      vals = []
      cols.each do |name|
        vals << "'#{record[name]}'"
      end
      vals_csv = vals.join(',')
      sql << "insert into #{table} (#{cols_csv}) values (#{vals_csv});"
    end
    send_data( sql.join("\n") ,  :filename=>"#{table}.sql", :type=>'text/plain;charset=UTF8')
  end

end

コメント

コメントしてください

closed.