Pergunta

Eu tenho duas máquinas ... uma máquina de desenvolvimento e uma máquina de produção. Quando eu trouxe o meu primeiro rails aplicativo no servidor de produção, não tive nenhum problema. Eu simplesmente importados schema.rb executando rake db: schema: load RAILS_ENV = produção. Tudo estava bem.

Assim, então na minha máquina de desenvolvimento, fiz mais algumas mudanças e outra migração e copie o novo aplicativo para a máquina de produção. Então eu tentei atualizar o banco de dados executando rake db: migrar RAILS_ENV = produção. Estou tendo o erro a seguir: "Já existe um objeto chamado 'schema_migrations' no banco de dados."

Eu estou pensando comigo mesmo, ya no Rake brincadeira ... você criou! Corri rastro no ancinho e parece como se ancinho acha que é a primeira vez que jamais correu. No entanto, analisando minha mesa 'schema_migrations' na minha máquina de desenvolvimento e minha máquina de produção você pode ver que há uma diferença de uma migração, ou seja, o que eu deseja migrar.

Eu também tentei a explicitamente definir o número da versão, mas isso não quer trabalhar.

Algumas ideias sobre como eu posso trazer o meu servidor de produção até à data?

Update:

Deixe-me começar por dizer que eu não posso simplesmente 'drop' banco de dados. É um servidor de produção com um pouco mais de 100 mil registros já nele. O que acontece se um problema semelhante ocorre no futuro? Am, eu apenas remover a tabela cada vez que um problema de banco de dados ocorre? Pode funcionar desta vez, mas não parece ser uma solução prática a longo prazo para todos os problemas de banco de dados. Eu duvido que o problema que estou tendo agora é único para mim.

  1. Parece que a tabela 'schema_info' ea tabela 'schema_migrations' são os mesmos. Na minha configuração, eu só tenho 'schema_migrations'. Como foi referido anteriormente, a diferença entre a tabela 'schema_migrations' no servidor de produção ea máquina de desenvolvimento é apenas um registro. Ou seja, o registro que contém o número da versão da mudança Eu quero migrar.

  2. A partir do livro que li, 'Simplesmente Rails 2', ele afirma que, quando primeiro indo para um servidor de produção, em vez de correr rake db: migrar, deve-se simplesmente rodar rake: db: schema:. Carga

  3. Se é importante, eu estou usando Rails versão 2.1.

Nenhuma solução correta

Outras dicas

Este é um palpite, eu admito: Eu acho que porque você primeiro db RAN: schema: load em vez de db: migrar em seu ambiente de produção, você tem a estrutura do seu db, mas não os dados que preenche migrar para o seu mesa schema_info. Então, agora, quando você executar migrar no ambiente de produção, não há dados em schema_info é por isso que migram acredita que não foi executado ainda (porque não tem).

Dito isto ... você dizer que você olhou na tabela "schema_migrations", e que há uma diferença de uma versão de dev para produção ... Eu não ouvi falar de que a tabela, embora eu sou alguns meses atrás na minha versão trilhos. Talvez você poderia tentar criar uma tabela "schema_info" no ambiente de produção, com uma única coluna "versão", e adicionar uma linha com a versão que você acredita que seu ambiente de produção para ser ligado.

Se você receber "Já existe um objeto chamado 'schema_migrations' no banco de dados." mensagem de erro, então eu suspeito que você está usando MS SQLServer como seu banco de dados? (Como este parece ser mensagem de erro MS SQL Server)

Se sim, então qual adaptador de banco de dados ActiveRecord você está usando? (Qual é o seu arquivo database.yml, que gemas você tem instalado para acessar banco de dados MS SQL Server?)

Atualmente, parece que Rails não encontrar a tabela schema_migrations no esquema de produção e, portanto, tenta criá-lo e esta criação falhar com mensagem de erro do banco de dados. Provavelmente, a razão é superior / minúsculas permite em nome da tabela schema_migrations - tanto quanto eu entendo identificadores MS SQL Server são maiúsculas de minúsculas

.

Dependendo do sistema utilizado na produção, tenho visto casos em que a seguir faz não trabalho:

rake db:migrate RAILS_ENV=production

Mas onde este faz o trabalho:

RAILS_ENV=production rake db:migrate

Quirky, eu sei, mas vale a pena tentá-lo para ver se ele faz a diferença.

Quanto à sua actualização:

  1. Eu não entendo qual é a diferença entre seus schema_migrations de produção e a versão dev. Existe um registro em ambas as tabelas (deve haver apenas uma coluna, "versão", à direita) ou há um único registro no dev DB e zero registros em produção? Se há zero registros na tabela de produção, em seguida, faça o seguinte:

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. Como alternativa, você pode tentar deixar cair a tabela schema_migrations totalmente na produção:

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    Então, rake db:migrate RAILS_ENV=production re-execução. Que irá executar migrações a partir a partir da versão 1, porém, que provavelmente não é o que você está depois.

  3. Como alternativa, alternativamente, você pode iniciar uma sessão de IRB no seu ambiente de produção, não quer um "exigir" ou "carga" (Eu nunca me lembro qual, ou se importa) do arquivo de migração que deseja carga e MyMigrationClass.up chamada então. Você precisará configurar manualmente o número da versão na tabela de schema_migrations depois disso, como você ainda tem o problema daqui para frente, mas como um tipo de correção rápida de corte, que iria funcionar.

Gostaria apenas de deixar cair a DB, adicioná-lo novamente e rb prazo ancinho: Migrar. Brad é correto que quando você executou a carga esquema, ele não colocou nenhum registro na tabela de schema_migrations.

Este é mais complicado, claro, se houver dados que você não pode perder no servidor de produção. Você poderia começar as tarefas de backup ancinho (não tenho certeza se isso é parte do core ou não) e rake db em seguida, executar: backup: gravação em seu banco de dados de produção, e rake db em seguida, depois que você começa as migrações até à data sobre a produção, execute: backup:. read

schema_info é de uma versão antiga do Rails. schema_migrations é o novo garoto sobre o bloco. Você deve ser capaz de remover a tabela schema_info como ele vai deixar de ser utilizada. Você provavelmente vai querer procurar quaisquer problemas associados a este mudança de nome.

rake db: schema: load irá carregar a estrutura de banco de dados de schema.rb. Este arquivo é a representação atual da estrutura de banco de dados. É usado quando você tem um esquema vazio (banco de dados) que precisa de todas as tabelas e índices criando. Isso evita que você ter que executar todas as migrações. Se você tem um banco de dados de produção existente com os dados, você não quer executá-lo. Como já foi dito que seria ruim!

Eu sei que este post foi há algum tempo, mas me deparei com ele e realmente não foi respondida. Como ele vem para cima no google, aqui vai.

Quando você fez um rake db: schema: despejo (ou quando isso foi feito para você pelos scripts de construção) terá colocar a definição da tabela de migrações no schema.rb. No final do script, o processo irá tentar criar a tabela novamente, no entanto, obviamente, já existe. Basta remover a mesa de migrações a partir do schema.rb antes de executar ancinho: esquema:. Carga e não haverá nenhuma mensagem de erro

Você precisará definir o número da versão na tabela de migrações para migrações posteriormente executados. Por isso, é importante saber o que a versão do seu schema.rb relaciona também, ou excluir todas as antigas migrações (eles estão em segurança no seu direito SCM?)

rake db:migrate RAILS_ENV=production

Use a tarefa db:schema:load apenas para a primeira criação, mudanças incrementais devem ser migrados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top