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.Respostas:
Gerando a "primeira migração"
No seu caso, a maneira mais confiável é fazê-lo quase manualmente. Eu sugeriria usar a ferramenta sequelize-cli . A sintaxe é bastante simples:
Isso criará o modelo e a migração. Em seguida, mescle manualmente seus modelos existentes com os gerados com sequelize-cli e faça o mesmo com migrações. Depois de fazer isso, limpe o banco de dados (se possível) e execute
Isso criará migrações de esquema. Você deve fazer isso apenas uma vez para alternar para o processo adequado de desenvolvimento de esquema (sem sincronização: force, mas com migrações autorizadas).
Mais tarde, quando você precisar alterar o esquema:
sequelize migration:create
sequelize db:migrate
Executando Migrações na Produção
Obviamente, você não pode ssh para o servidor de produção e executar migrações manualmente. Use umzug , ferramenta de migração independente de estrutura para o Node.JS para executar migrações pendentes antes do aplicativo ser iniciado.
Você pode obter uma lista de migrações pendentes / ainda não executadas como esta:
Em seguida, execute migrações ( retorno de chamada interno ). O método execute é uma função de uso geral que executa para cada migração especificada a respectiva função:
E minha sugestão é fazê-lo antes que o aplicativo seja iniciado e tente sempre servir rotas. Algo assim:
Não posso tentar isso agora, mas, à primeira vista, deve funcionar.
UPD abr. 2016
Depois de um ano, ainda é útil, então compartilhe minhas dicas atuais. Por enquanto, estou instalando o
sequelize-cli
pacote conforme a dependência ativa necessária e modifique os scripts de inicialização do NPM dapackage.json
seguinte maneira:A única coisa que preciso fazer no servidor de produção é
npm start
. Este comando executará todas as migrações, aplicará todos os semeadores e iniciará o servidor de aplicativos. Não há necessidade de chamar umzug manualmente.fonte
pending
e depoisexecute
fazerumzug.up().then(function (migrations) { app.listen(3000); })
. De acordo com a documentação do umzug, isso executará todas as migrações pendentes.Estou aprendendo isso sozinho, mas acho que recomendo usar as migrações agora para que você se acostume. Eu descobri que o melhor para descobrir o que ocorre na migração é examinar o sql nas tabelas criadas por
sequelize.sync()
e depois criar as migrações a partir daí.Criará o arquivo de migração de modelo em um diretório de migrações. Você pode preenchê-lo com os campos que você precisa criar. Este arquivo precisará incluir
createdAt
/updatedAt
, campos necessários para associações, etc.Para a criação da tabela inicial, o down deve ter:
Porém, atualizações subseqüentes na estrutura da tabela podem deixar isso de fora e usar apenas alterar tabela.
Um exemplo de criação seria semelhante a:
Para refazer desde o início:
Estou usando o café para executar um arquivo de sementes para preencher as tabelas após:
Isso apenas tem uma função de criação que se parece com:
Lembre-se de levar seu
sync()
índice de seus modelos ou ele substituirá o que as migrações e as sementes fazem.Os documentos estão em http://sequelize.readthedocs.org/en/latest/docs/migrations/, é claro. Mas a resposta básica é que você precisa adicionar tudo para especificar os campos necessários. Não faz isso por você.
fonte
sequelize.sync()
ter um script gerado que crie todas as tabelas e índices base como sua primeira migração (semelhante ao rails 'schema.rb
). Depois de ler isso, parece que sua melhor aposta pode ser exportar seu esquema inicial como sql, coloque-o em uma grandeexec
declaração na sua primeira migração. A partir daí, você estará executando alterações incrementais em um ponto de partida conhecido da "versão 1.0".Para o desenvolvimento , agora existe uma opção para sincronizar as tabelas atuais alterando sua estrutura. Usando a versão mais recente do repositório de sequências do github , agora você pode executar a sincronização com o
alter
parâmetroUma ressalva dos documentos:
fonte
Agora, com a nova sequela da migração, é muito simples.
Este é um exemplo do que você pode fazer.
Lembre-se de que você deve definir:
"dialectOptions": { "multipleStatements": true }
na configuração do banco de dados.
fonte
Use a versão. A versão do aplicativo depende da versão do banco de dados. Se a nova versão exigir uma atualização de um banco de dados, crie uma migração para ele.
update: decidi abandonar a migração ( KISS ) e executar o script update_db (sync forse: false) quando necessário.
fonte
sync()
-lo e que preciso escrever manualmente as migrações do esquema dos modelos da versão anterior para os modelos da versão mais recente?Um pouco tarde, e depois de ler a documentação, você não precisa ter a primeira migração de que está falando. Tudo o que você precisa fazer é ligar
sync
para criar as tabelas.sequelize.sync()
Você também pode executar uma sincronização de modelo simples, fazendo algo como:
Project.sync()
mas acho que essesequelize.sync()
é um caso geral mais útil para o seu projeto (desde que você importe os bons modelos na hora de início).(extraído de http://sequelizejs.com/docs/latest/models#database-synchronization )
Isso criará todas as estruturas iniciais . Depois, você só precisará criar migrações para evoluir seus esquemas.
espero que ajude.
fonte
sequelize.sync()
e o que faz.Sequelize pode executar SQL arbitrário de forma assíncrona .
O que eu faria é:
mysql_dump -uUSER -pPASS DBNAME > FILE.SQL
var baseSQL = "LOTS OF SQL and it's EVIL because you gotta put \ backslashes before line breakes and \"quotes\" and/or sum" + " one string for each line, or everything will break";
var baseSQL = fs.readFileSync('../seed/baseDump.sql');
Isso deve cuidar da configuração do banco de dados, embora a coisa assíncrona possa se tornar um problema. Se isso acontecer, eu procuraria uma maneira de adiar o retorno da
up
função sequelize até que aquery
função assíncrona seja concluída.Mais sobre o mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
Mais sobre Sequelizar migrações: http://sequelize.readthedocs.org/en/latest/docs/migrations/
Mais sobre Executando o SQL na Migração de Sequelize: https://github.com/sequelize/sequelize/issues/313
fonte
Aqui está o meu fluxo de trabalho atual. Estou aberto a sugestões.
Dessa forma, você não precisa atualizar manualmente a tabela de migrações e precisa se preocupar com dedos gordos, mas ainda recebe um ORM.
fonte
Amigo, tive a mesma pergunta e consegui entender como usá-los.
Comecei sem ORM sequelizar, portanto, eu já tinha um modelo de dados.
Eu tive que gerar os modelos automaticamente com sequelize-auto e gerar suas migrações com este arquivo que você cria https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 e coloca em sync (
{Force: false}
)Isto está em dev.I teria de versão o modelo e as migrações e as executo sempre que puxo o código.
Na produção, o servidor está apenas no andar de cima; portanto, você só precisa executar migrações e, em cada confirmação, gerenciar, pois fará a versão do modelo sem parar o back-end.
fonte
Eu passei por este post e perguntas semelhantes, ele realmente não respondeu para mim. As migrações são úteis para girar bancos de dados locais e atualizar dados na produção
Fiz a pergunta aqui e também a respondi: Fluxo de trabalho para lidar com sequências de migrações e inicialização?
Versão TL-DR para um projeto greenfield
.sql
arquivo inteiro sobresequelize init:migrate
na pasta onde vocêmodels
estiversequelize migration:generate --name [name_of_your_migration]
com essa estrutura geral de pastas
sequelize migration:generate --name [name_of_your_migration]
up
e dedown
migração. Estas são as suas instruções ALTER para alterar nomes de colunas, DELETE, ADD etcsequelize db:migrate
npm install sequelize-auto
.sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgres
encontrado em https://github.com/sequelize/sequelize-autoVocê pode usar o git para ver os difflogs em seu modelo; deve haver apenas mudanças refletindo alterações no modelo de banco de dados. Como uma observação lateral, nunca modifique o
models
diretamente se você o usarsequelize auto
, pois isso irá gerá-los para você. Da mesma forma, você não deve mais modificar seu esquema de banco de dados diretamente com arquivos SQL, desde que essa seja uma opção, pois você também pode importar esses.sql
arquivosAgora, o esquema do seu banco de dados está atualizado e você mudou oficialmente para sequenciar apenas as migrações do banco de dados.
Tudo é controlado por versão. Esse é o fluxo de trabalho ideal para desenvolvedores de banco de dados e back-end
fonte
Existe uma maneira ainda mais simples (evitando Sequalize). Que é assim:
Você digita um comando dentro do seu projeto: npm run migrate: new
Isso cria 3 arquivos. Um arquivo js e dois arquivos sql nomeados para cima e para baixo
Para que isso funcione, consulte o db-migrate módulo .
Depois de configurá-lo (o que não é difícil), alterar seu banco de dados é realmente fácil e economiza muito tempo.
fonte