Dicas para trabalhar com o Ionic Framework – Persistence.js Migrations
Mesmo com todas as vantagens de bancos não relacionais como o PouchDB ainda existem aqueles que ainda preferem os bancos relacionais por fatores como familiaridade, curva de aprendizagem, equipe, backend já é relacional, etc. ou simplesmente por que o não relacional não atende ou não é a melhor indicação para o projeto em questão.
Quando essas pessoas vão trabalhar com o Ionic elas normalmente optam pelo plugin de SQLite do Cordova e não tem nada de errado nisso, porém se formos fazer um paralelo com desenvolvimento em Java ou PHP é como se utilizássemos os drives nativos de comunicação com o banco de dados sem utilizar um ORM como o Hibernate ou o Doctrine.
E essa forma de trabalhar sem um ORM pode acarretar alguns problemas quando nossos bancos mudam. Quando projetamos um banco de dados relacional nós esperamos que ele nunca vá mudar, pois estamos criando estruturas para armazenar os dados muito rígidas e altamente acopladas umas as outras. No entanto, conforme a aplicação vai crescendo normalmente é necessário alterar essa estrutura ou schema de dados que definimos e nesse momento iremos precisar de alguma ferramenta para fazer a migração do antigo schema de dados para o novo. E esse é um dos problemas que os ORM’s buscam solucionar.
E durante um dos meus cursos na Futuring sobre Apps híbridos eu fui questionado por meus alunos sobre a melhor forma de trabalhar com dados relacionais no Ionic pensando nessas migrações de dados. E essa pergunta me levou a fazer uma pesquisa para encontrar essa melhor forma para que eu pudesse responder aquela pergunta. Foi então que eu encontrei o persistence.js.
persistence.js
O persistence.js é um ORM escrito em javascript que trabalha de forma assíncrona. Ele pode ser usado tanto no navegador quanto no Node.js. Quem já trabalhou ou trabalha com algum tipo de ORM não terá dificuldades para se adaptar a ele. Mas o que torna essa biblioteca a melhor opção para quem quer trabalhar com bancos de dados relacionais são seus plugins. Basicamente ela possui 3 plugins que me chamaram a atenção:
persistence.search.js: adiciona a possibilidade realizar consultas do tipo FullText em nossos registros.
persistence.migrations.js: adiciona suporte a migração de dados (alterações no schema do banco de dados).
persistence.sync.js: implementa a capacidade de sincronização com servidores remotos desde que o backend respeite algumas regras.
Um outro ponto que vale a pena ressaltar é o fato de que quando o plugin de SQLite do Cordova está instalado em nossa aplicação, automaticamente o pesistence.js irá tentar trabalhar com ele (assim como o PouchDB) e se por algum motivo ele não consiguir, irá fazer o fallback para o WebSQL.
Embora a biblioteca possua inúmeros outros recursos especificamente nesse artigo iremos focar na migração de dados.
Migrations
Agora que já conhecemos a biblioteca e os motivos pelos quais eventualmente precisaremos realizar migrações de dados que tal darmos uma olhada em como fazê-lo com o persistence.js?
A primeira coisa que temos que saber é que o plugin de migrations foi inspirado nas migrations do Ruby on Rails, logo, quem já utiliza o Rails se sentirá ainda mais confortável com a ferramenta.
persistence.defineMigration(1, {
up: function() {
this.createTable('Feed', function(t){
t.text('nome');
t.text('conteudo');
t.text('url');
t.boolean('favoritado');
});
},
down: function() {
this.dropTable('Feed');
}
});
De forma simplista uma migration pode ser definida como descrita acima, onde estamos adicionando uma tabela com o nome Feed
que possui 3 colunas textuais (nome
, conteudo
e url
respectivamente) e uma coluna booleana chamada favoritado
. Uma coluna chamada id
que será nossa chave primária também será adicionada, porém, como esse é um comportamento default nós não precisamos descrevê-la.
O primeiro argumento passado para nossa migration é a versão da mesma, logo, quando quisermos voltar para uma migration específica basta passar essa versão como parâmetro.
Como rodar as migrations?
Primeiro é necessário iniciar o plugin de migrations:
persistence.migrations.init(function() {
// Callback que será executada após a inicialização
});
Depois precisaremos carregar nossas migrations. A documentação recomenda utilizar o RequireJS para isso. Após carregá-las nós devemos executá-las como no exemplo a seguir:
requirejs(['migrations'], function() {
// Irá executar as migrações para a versão mais recente
persistence.migrate(function(){
// Callback que será executada após migração ser concluída
});
});
Caso seja necessário voltar versões o primeiro parâmetro do método migrate
será o número da versão a ser restaurada:
requirejs(['migrations'], function() {
// Irá executar as migrações para a versão 1
persistence.migrate(1, function(){
// Callback que será executada após migração ser concluída
});
});
Agora vocês conhecem o persistence.js e como realizar migrations com ele. O plugin de migrations também pode ser utilizado para tratar dados inconsistente ou popular novos campos como vocês podem consultar em sua documentação.
Enfim
Escolhi escrever sobre bancos de dados relacionais dessa vez pois notei que é um tópico recorrente na comunidade Ionic Framework Brasil. Nesse artigo vimos que é fácil trabalhar com dados relacionais em projetos Cordova e em meu próximo artigo sobre o persistence.js irei dissecar a forma de realizar sincronização em bancos de dados relacionais.