Pregunta

Tengo una migración que ejecuta un script SQL para crear un nuevo esquema de Postgres.Al crear una nueva base de datos en Postgres, de forma predeterminada, se crea un esquema llamado "público", que es el esquema principal que utilizamos.La migración para crear el nuevo esquema de base de datos parece estar funcionando bien, sin embargo, el problema ocurre después de que se ha ejecutado la migración, cuando Rails intenta actualizar la tabla 'schema_info' en la que se basa, dice que no existe, como si fuera buscándolo en el nuevo esquema de base de datos y no en el esquema 'público' predeterminado donde realmente se encuentra la tabla.

¿Alguien sabe cómo puedo decirle a Rails que mire el esquema "público" de esta tabla?

Ejemplo de SQL en ejecución:~

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

Error al lanzarse:~

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

Gracias por tu ayuda

Chris Caballero

¿Fue útil?

Solución

Bueno, eso depende de cómo se vea tu migración, cómo se ve tu base de datos.yml y qué estás intentando intentar exactamente.De todos modos, se necesita más información, cambie los nombres si es necesario y publique un ejemplo de base de datos.yml y la migración.¿La migración cambia la ruta de búsqueda del adaptador, por ejemplo?

Pero sepa que, en general, los esquemas Rails y PostgreSQL no funcionan bien juntos (¿todavía?).

Hay algunos lugares que tienen problemas.Pruebe y cree una aplicación que use solo una base de datos de páginas con 2 esquemas no predeterminados, uno para desarrollo y otro para prueba, y cuénteme al respecto.(de lo siguiente ya te puedo decir que te quemarás)

Tal vez se arregló desde la última vez que jugué con él, pero cuando veo http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used o esto http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list o esto en postgresql_adapter.rb

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

(Sí, esto está mal, si usa la misma base de datos con esquemas diferentes tanto para desarrollo como para prueba, ¡esto eliminaría ambas bases de datos cada vez que ejecute las pruebas unitarias!)

De hecho, comencé a escribir parches.el primero fue para los métodos de índices en el adaptador a los que no les importaba que search_path terminara con índices duplicados en algunas condiciones, luego comencé a sentirme lastimado por el resto y terminé abandonando la idea de usar esquemas:quería conseguir mi La aplicación terminó y no tuve el tiempo adicional necesario para solucionar los problemas que tuve al usar esquemas.

Otros consejos

No estoy seguro de entender exactamente lo que estás preguntando, pero rake esperará actualizar la versión del esquema Rails en la tabla esquema_info.Verifique su archivo de configuración Database.yml, aquí es donde rake buscará la tabla para actualizar.

¿Existe la posibilidad de que esté migrando a un nuevo esquema de Postgres y rake todavía apunte al anterior?Entonces no estoy seguro de que lo que necesita sea una migración de Rails estándar.En su lugar, podría ser mejor crear su propia tarea de rake.

Editar:Si hace referencia a dos bases de datos diferentes o esquemas de Postgres, Rails no admite esto en las migraciones estándar.Rails asume una base de datos, por lo que normalmente no es posible realizar migraciones de una base de datos a otra.Cuando ejecuta "rake db:migrate", en realidad mira la variable de entorno RAILS_ENV para encontrar la entrada correcta en Database.yml.Si rake inicia la migración mirando el entorno de "desarrollo" y la configuración de la base de datos desde el archivo Database.yml, esperará actualizar a este entorno al final de la migración.

Por lo tanto, probablemente necesitarás hacer esto desde fuera de la pila de Rails, ya que no puedes hacer referencia a dos bases de datos al mismo tiempo dentro de Rails.Hay intentos de crear complementos para permitir esto, pero en su mayoría son complicados y no funcionan correctamente.

Puedes usar pg_poder.Proporciona DSL adicional para la migración para crear esquemas PostgreSQL y no solo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top