Converter MySQL para MongoDB

maio 20th, 2010 | by | converter, mongodb, mysql, nosql, sql

mai
20

Notando que a maioria dos programadores PHP utilizam MySQL e para você começar a usar o MongoDB ncessita de uma base de dados para começar a programar sua funções, tive a idéia de criar um conversor simples de MySQL para MongoDB. Aqui vou explicar o seu código e como é simples utilizar o MongoDB com PHP.

Criei uma interface bem simples para que possamos enviar os dados sem precisar ficar mudando no código.

Interface do meu conversor

Interface do meu conversor

Essa interface enviará, via POST, as variáveis de conexão com o banco de dados MySQL.

$host = isset($_REQUEST['host_mysql']) ? $_REQUEST['host_mysql'] : “localhost”;

$user = isset($_REQUEST['user_mysql']) ? $_REQUEST['user_mysql'] : “usuario”;

$pass = isset($_REQUEST['pass_mysql']) ? $_REQUEST['pass_mysql'] : “senha”;

$db   = isset($_REQUEST['db_mysql']) ? $_REQUEST['db_mysql'] : “teste_latin”;

Agora é hora de criar a conexão com o MongoDB utilizando uma extensão instalada no php: http://github.com/downloads/mongodb/mongo-php-driver/mongo-1.0.6-r1-php5.3vc6ts.zip

try{

$conexao = new Mongo(); //abre conexão com o MongoDB

$db_mongo = $conexao->$db; //cria a database com o mesmo nome do MySQL

}

catch(MongoConnectionException $e){

die(“<h1 class=’erro’>Erro do banco de dados MONGODB – Inicie o servidor do MongoDD!</h1><span class=’dica’>Dica: Entre no prompt do windows<br />

cd \ <br />

cd mongodb<br />

cd bin<br />

mongod </span>”);

}
Caso o seu MongoDB não esteja rodando o script indicará o erro e mostrará a forma como iniciar seu MongoDB no Windows.

Para conseguirmos pegar o nome de todas as tabelas da nossa database no MySQL utilizamos a seguinte query:

$query_pega_tabelas = “SHOW TABLES”;

O nome do nosso campo contendo as tabelas será:

$index_tabelas = “Tables_in_”.$db; //nome do array com o valor do nome das tabelas via SHOW TABLES
Onde a variável $db será o nome da nossa database no MySQL. Após pegarmos os nomes das nossas tabelas é hora de irmos tabela por tabela pegando seus dados e inserindo-os, não será necessário pegar os metadados(tipo, tamanho) dos campos pois o MongoDB não necessita dessas informações.

if($result_pega_tabelas=mysql_query($query_pega_tabelas)){

while($arr_pega_tabelas[] = mysql_fetch_assoc($result_pega_tabelas)){

}

$rs_charset=mysql_query($query_charset);

foreach($arr_pega_tabelas as $c=>$v){

if(is_array($v)){

foreach($v as $a => $b){

echo “<h3>Tabela: “.$b.”</h3>”;

$nome_tabela = $b;

$query_pega_dados = “EXPLAIN “.$nome_tabela;

if($result_pega_dados=mysql_query($query_pega_dados)){

$arr_pega_dados = array();

while($arr_pega_dados = mysql_fetch_assoc($result_pega_dados)){

$arr_totalis[$nome_tabela][] = $arr_pega_dados;

}//fim while

}//fim if query pega dados

}//fim foreach

}//fim if array

}//fim foreeach

Geramos uma collection para cada tabela existente no MySQL.

foreach($arr_totalis as $c => $v){

$query = ‘select * from ‘.$c;

$collection = $db_mongo->$c;

$rs_select = mysql_query($query);

echo “Inserindo em “.$c.”<br />”;

echo “<pre>”;

while($arr_dados = mysql_fetch_assoc($rs_select)){

Precisamos codificar nossos valores, assim como os campos, em utf8. Porém caso nosso banco já esteja em utf8 não será necessária a conversão. Para isso criei um pequena função utilizando iconv.

foreach($arr_dados as $c => $v){

$obj[utf8_encode_suissa($c)] = utf8_encode_suissa($v);

}//fim foreach

$arr[] = $obj;

}//fim while

$erro = 0;

No caso meu banco que será convertido está codificado em latin1, correspondente ao charset iso-8859-1. Essa função vai ao final do script.

function utf8_encode_suissa($s) {

return iconv(‘iso-8859-1′, ‘utf-8′, $s);

}

Após a conversão para utf8 inserimos o objeto codificado, com a função insert(), na nossa collection que terá o mesmo nome que a tabela correspondente no MySQL.

foreach($arr as $cc => $vv){

if(!$collection->insert($vv)){

echo “Não inseriu”.print_r($c) ;

$erro++;

$var_erro[] = var_dump($vv);

}//fim if

}//fim foreach

Caso tenha ocorrido algum erro mostrará-o com var_dump, só para ter uma noção de como os dados estão estruturados.

if($erro > 0){

echo “<h3>Aconteceram os seguintes erros:</h3>”;

foreach($var_erro as $f => $g){

var_dump($g);

}//fim foreach

}//fim if

echo “</pre>”;

}//fim foreach

}//fim if

Ao término do script você poderá entrar no phpMoAdmin, ferramenta para manipular as bases e as collections do MongoDB, e ver na lista das databases sua nova base criada.

phpMoAdmin

phpMoAdmin

O scrip completo com a interface para inserir os dados se encontra em: http://www.nosqlbr.com.br/conversor_mysql_mongodb.zip

Authored by

One Response to “Converter MySQL para MongoDB”

Show / Hide Comments
  1. [...] This post was mentioned on Twitter by Alessandro Martins, NoSQL BRASIL. NoSQL BRASIL said: #nosql : Converter MySQL para MongoDB http://www.nosqlbr.com.br/converter-mysql-para-mongodb.html #mysql #mongodb [...]