Estou perto de ter meu projeto pronto para lançar. Tenho grandes planos para após o lançamento e a estrutura do banco de dados será alterada - novas colunas nas tabelas existentes, bem como novas tabelas e novas associações aos modelos existentes e novos.
Ainda não toquei em migrações no Sequelize, pois só tive dados de teste que não me importo de eliminar toda vez que o banco de dados muda.
Para esse fim, no momento eu estou executando sync force: true
quando meu aplicativo é iniciado, se eu alterei as definições de modelo. Isso exclui todas as tabelas e as cria do zero. Eu poderia omitir a force
opção de criar apenas novas tabelas. Mas se os existentes foram alterados, isso não é útil.
Então, quando adiciono migrações, como as coisas funcionam? Obviamente, não quero que as tabelas existentes (com dados nelas) sejam apagadas, o que sync force: true
está fora de questão. Em outros aplicativos que ajudei a desenvolver (Laravel e outras estruturas) como parte do procedimento de implantação do aplicativo, executamos o comando migrate para executar qualquer migração pendente. Mas nesses aplicativos, a primeira migração tem um banco de dados esqueleto, com o banco de dados no estado em que estava há algum tempo no início do desenvolvimento - a primeira versão alfa ou o que quer. Assim, mesmo uma instância do aplicativo atrasada para a festa pode acelerar de uma só vez, executando todas as migrações em sequência.
Como faço para gerar essa "primeira migração" no Sequelize? Se eu não tiver uma, uma nova instância do aplicativo mais adiante não terá um banco de dados esqueleto para executar as migrações ou executará a sincronização no início e fará com que o banco de dados fique no novo estado com todos os as novas tabelas, etc., mas quando tentar executar as migrações, elas não farão sentido, pois foram escritas com o banco de dados original e com cada iteração sucessiva em mente.
Meu processo de pensamento: em cada estágio, o banco de dados inicial mais cada migração em sequência deve ser igual (mais ou menos dados) ao banco de dados gerado quando sync force: true
é executado. Isso ocorre porque as descrições do modelo no código descrevem a estrutura do banco de dados. Talvez, se não houver tabela de migração, apenas executemos a sincronização e marcemos todas as migrações como concluídas, mesmo que não tenham sido executadas. É isso que eu preciso fazer (como?), Ou Sequelize deveria fazer isso sozinho, ou estou latindo na árvore errada? E se eu estiver na área certa, certamente deve haver uma boa maneira de gerar automaticamente a maior parte da migração, dados os modelos antigos (por hash de confirmação? Ou até mesmo cada migração pode estar vinculada a uma consolidação? Eu admito que estou pensando em um universo centrado no Git não portátil) e nos novos modelos. Ele pode diferenciar a estrutura e gerar os comandos necessários para transformar o banco de dados de antigo para novo e vice-versa, e então o desenvolvedor pode entrar e fazer os ajustes necessários (exclusão / transição de dados específicos, etc.).
Quando executo o binário sequencializado com o --init
comando, ele me fornece um diretório de migrações vazio. Quando eu executo, sequelize --migrate
isso me torna uma tabela SequelizeMeta sem nada, sem outras tabelas. Obviamente não, porque esse binário não sabe como inicializar meu aplicativo e carregar os modelos.
Eu devo estar esquecendo alguma coisa.
TLDR: como configuro meu aplicativo e suas migrações para que várias instâncias do aplicativo ao vivo possam ser atualizadas, bem como um aplicativo totalmente novo sem banco de dados inicial herdado?
sync
por enquanto, a ideia é que as migrações "gerem" todo o banco de dados, portanto, contar com um esqueleto é um problema. O fluxo de trabalho do Ruby on Rails, por exemplo, usa Migrações para tudo, e é incrível quando você se acostuma. Edit: E sim, notei que esta pergunta é bastante antiga, mas como nunca houve uma resposta satisfatória e as pessoas podem vir aqui procurando orientação, achei que deveria contribuir.