Pergunta

Eu tenho uma migração que executa um script SQL para criar um novo esquema Postgres. Ao criar um novo banco de dados Postgres, por padrão, ele cria um esquema chamado 'público', que é o principal esquema que usamos. A migração para criar o novo esquema do banco parece estar funcionando bem, no entanto, o problema ocorre após a migração foi executado, quando trilhos tentativas para atualizar a tabela 'schema_info' porque conta com ele diz que ele não existe, como se fosse procurá-la no novo esquema de banco de dados e não o padrão de esquema 'público' onde a tabela é realmente.

Alguém sabe como eu posso dizer trilhos de olhar para o esquema do 'público' para esta tabela?

Exemplo de SQL que está sendo executado: ~

CREATE SCHEMA new_schema;
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
-- various tables, triggers and functions created in new_schema

Erro sendo jogado: ~

RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??

Obrigado por sua ajuda

Chris Knight

Foi útil?

Solução

Bem, isso depende do que a sua aparência de migração gosta, o que seus database.yml parece e que exatamente você está tentando tentar. Enfim mais informações é necessária mudança os nomes se você tiver que e postar um exemplo database.yml e a migração. se a migração mudar o search_path para o adaptador, por exemplo?

Mas sei que em trilhos gerais e esquemas PostgreSQL não funcionam bem juntos (ainda?).

Existem alguns lugares que têm problemas. Tentar construir e app que usa apenas um banco de dados pg com um 2 não-padrão esquemas para dev e um para teste e me dizer sobre isso. (A partir thefollowing já posso dizer que você vai ficar queimado)

Talvez tenha sido corrigido desde a última vez que joguei com ele, mas quando vejo http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name- breaks-quando-não-default-esquema é utilizado ou este http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list ou esta em postgresql_adapter.rb

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(sim isso é errado se você usar o mesmo banco de dados com esquemas diferentes para ambos os dev e teste, este cairia dois bancos de dados cada vez que você executar os testes de unidade!)

Na verdade, eu comecei a escrever patches. o primeiro foi para os métodos de índices no adaptador que não se preocupam com o search_path acabar com índices duplicados em algumas condições, então eu comecei a ficar ferido pelo resto e acabou abandonning a ideia de utilizar esquemas: Eu queria chegar minha aplicativo feito e eu não tive o tempo extra necessário para corrigir os problemas que tive usando esquemas.

Outras dicas

Eu não tenho certeza eu entendo o que você está pedindo exatamente, mas, ancinho estará esperando para atualizar a versão do esquema do Rails na tabela de schema_info. Verifique se o seu arquivo de configuração database.yml, este é o lugar onde ancinho estará olhando para encontrar a tabela de atualização.

É uma possibilidade que você está migrando para um novo esquema Postgres e ancinho ainda está apontando para o antigo? Eu não tenho certeza, então, que uma migração Rails padrão é o que você precisa. Poderia ser melhor para criar a sua própria tarefa rake vez.

Edit: Se você está referenciando dois bancos de dados diferentes ou esquemas Postgres, Rails não suporta esta em migrações padrão. Trilhos assume uma base de dados, de modo migrações de uma base de dados para outra não é geralmente possível. Quando você executar "rake db: migrar" que realmente olha para a variável de ambiente RAILS_ENV para encontrar a entrada correta na database.yml. Se ancinho começa a migração olhando para o meio ambiente "desenvolvimento" e configuração de banco de dados a partir database.yml, ele vai esperar para atualização a este ambiente no final da migração.

Assim, você provavelmente vai precisar fazer isso de fora da pilha Rails como você não pode fazer referência a dois bancos de dados ao mesmo tempo dentro do Rails. Há tentativas de plugins para permitir isso, mas eles são majorly hacky e não funcionam corretamente.

Você pode usar pg_power . Ele fornece DSL adicional para a migração para criar esquemas PostgreSQL e não só.

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