レンタルサーバにありがちな悩み
データベースの文字コード設定に無頓着だと、「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