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がでたが、、、
データは格納されているようだ。 これでいいのか(オレ) ???