postgreからmongodbへデータ移動

カテゴリー:未分類 作成日:2015年2月3日21:53

目的

f zugのbbsをmeteorで使う為にデータを移したい

方法

postgresql のデータを cvs形式で出力してmeteorで呼び込む

COPY テーブル名 TO '/tmp/output.csv' DELIMITER ','

この方法でCVSデータが取れそうだ。

実際の処理内容

database名 : chatbbs

table名 : chatmaintb、 chatsubtb

$> sudo su

#>su postgres

$>psql chatbbs

chatbbs=# COPY  chatmaintb TO '/tmp/chatmaintb.csv' DELIMITER ','

もう一個

chatbbs=# COPY  chatsubtb TO '/tmp/chatsubtb.csv' DELIMITER ','

これでCVSデータが取れた。

このデータを読み込んで、 split('\n')し、さらに split('\r\n')してmonogodbへインサートすれば完了するはず。

やってみる まず client側

bbsinport.html

<template name="bbs_inport">
    chatmaintb.cvsを選択します<input type="file" name="files[]" id="bbsmain_read" />
    chatsubtb.csvを選択します<input type="file" name="files[]" id="bbssub_read"  />
    {{> chatmain}}
    {{> chatsub}}
</template>

<!-- ここから保存が成功すれば即座に表示される為 表示して確認する -->

<template name="chatmain">
    <h3>Chatmaintb 10件分</h3>
    <ul>
    {{#each maindatas}}
      <li>mid: {{mid}} <br />
          maintitle: {{maintitle}} <br />
          subtitle: {{subtitle}}
      </li>
    {{/each}}
    </ul>
</template>

<template name="chatsub">
    <h3>Chatsubtb 10件分</h3>
    <ul>
        {{#each subdatas}}
          <li>mid: {{mid}} cid: {{ cid}}<br />
              date: {{createAt}} <br />
              name: {{name}}<br />
              email: {{email}}<br />
              comment: {{comment}} <br />
              delchk: {{delchk}}
          </li>
        {{/each}}
    </ul>
</template>

bbsinport.js

MainBbs = new Meteor.Collection('bbsmain');
CommentBbs = new Meteor.Collection('bbscomment');

Meteor.subscribe('allMainBbs');
Meteor.subscribe('allCommentBbs');


Template.bbs_inport.events({
    'change #bbsmain_read': function(event){
        var files = event.target.files;
        for (var i= 0, f; f = files[i]; i++ ){
            if(f.type.match('text.*')) {
                var reader = new FileReader();
                reader.onload = function(rfile) {
                    //var filesize = rfile.size;
                    var textfiles = reader.result;
                    Meteor.call('bbsmaintb_inport',textfiles,
                      function(error, result) {
                        if(error){
                            alert('bbsmaintbのインポートに失敗しました');
                        }
                      }
                    );
                }
                reader.readAsText(f, 'utf-8');

            }
        }
    },
    'change #bbssub_read': function(event){
        var files = event.target.files;
        for (var i= 0, f; f = files[i]; i++ ){
            if(f.type.match('text.*')) {
                var reader = new FileReader();
                reader.onload = function(rfile) {
                    //var filesize= rfile.size;
                    var textfiles = reader.result;
                    Meteor.call('bbssubtb_inport',textfiles,
                        function(error, result) {
                            if(error){
                                alert('bbssubtbのインポートに失敗しました');
                            }
                        }
                    );
                }
                reader.readAsText(f, 'utf-8');

            }
        }
    }

});

Template.chatmain.helpers({
    'maindatas': function(){
        return MainBbs.find({}, {limit: 10});
    }
});

Template.chatsub.helpers({
    'subdatas': function(){
        return CommentBbs.find({},{limit:10});
    }
});

ここから server側

publish.js

Meteor.publish('allMainBbs', function(){
    return MainBbs.find();
});

Meteor.publish('allCommentBbs',function(){
    return CommentBbs.find();
});

server.js

Meteor.methods({
    'bbsmaintb_inport': function(textfiles){
      var mdatas = textfiles.split('\n');

      for(var i=0; i<mdatas.length; i++){
          var dat = mdatas[i].split(',');
          MainBbs.insert({
              mid: dat[0],
              maintitle: dat[1],
              subtitle: dat[2]

          });
      }
    },
    'bbssubtb_inport': function(textfiles){
        CommentBbs.remove({});
        var nam,pas;
        var mdatas = textfiles.split('\n');

        for(var i=0; i<mdatas.length; i++){
            //元々文章に含まれたカンマは(\,)として保存されているようなので
            //split(',')で誤動作するのを防ぐため一旦'_Q_'に置き換える
            var tmdat = mdatas[i].split('\\,').join('_Q_');
            var dat = tmdat.split(',');
            //  _Q_を元に戻す
            dat[5] = dat[5].split('_Q_').join(',');
           //fzugbbs では、passwordを必要に迫られで後から name#passwordで保存していた為これを分離する 
            var pasdat = dat[3].split('#');
            if (pasdat.length === 1){
                nam = dat[3];
                pas = '';
            } else {
                nam = pasdat[0];
                pas = pasdat[1];
            }

            CommentBbs.insert({
                mid: dat[0],
                cid: dat[1],
                createAt: dat[2],
                name: nam,
                pass: pas,
                email: dat[4],
                comment: dat[5],
                delchk: dat[6]
            });
        }

    },
}

bbssubtbのインポートに失敗しました とalertがでたが、、、

データは格納されているようだ。 これでいいのか(オレ) ???