Frage

Ich habe eine Migration, die einen SQL-Skript läuft ein neues Postgres-Schema zu erstellen. Wenn Sie eine neue Datenbank in Postgres standardmäßig die Erstellung erstellt es ein Schema ‚öffentlich‘ genannt, die das Hauptschema ist, die wir verwenden. Die Migration der neuen Datenbankschema zu erstellen scheint zu funktionieren gut, jedoch tritt das Problem auf, nachdem die Migration ausgeführt wurde, wenn Schienen versucht, den ‚schema_info‘ Tabelle zu aktualisieren, dass sie verlässt sich auf sie sagt, dass sie nicht existiert, als ob es suche sie in dem neuen Datenbank-Schema und nicht der Standard ‚public‘ Schema, in dem die Tabelle tatsächlich ist.

Weiß jemand, wie ich Schienen sagen kann an dem ‚öffentlichen‘ Schema für diese Tabelle aussehen?

Beispiel von SQL ausgeführt wird: ~

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

Fehler geworfen: ~

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

Danke für Ihre Hilfe

Chris Knight

War es hilfreich?

Lösung

Nun, das hängt, was Ihre Migration aussieht, was Ihr database.yml aussieht und was genau Sie versuchen zu versuchen. Auf jeden Fall werden mehr Informationen ändern die Namen erforderlich, wenn Sie an und poste ein Beispiel database.yml und die Migration haben. hat die Migration die search_path für den Adapter zum Beispiel ändern?

Aber wissen, dass im Allgemeinen Schienen und postgresql Schemata arbeiten nicht gut zusammen (noch?).

Es gibt ein paar Orte, die Probleme haben. Versuchen Sie, und bauen und Anwendung, die nur eine pg Datenbank mit 2 Nicht-Standard-Schemata eines für Entwickler und ein für Test und erzähl mir davon verwendet. (Aus der folgenden kann ich Ihnen schon sagen, dass Sie verbrennen wird)

Vielleicht war es seit dem letzten Mal fixiert ich mit ihm gespielt, aber wenn ich sehe, http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name- Pausen-wenn-nicht-Standard-Schema-is-verwendet oder das http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list oder diese in postgresql_adapter.rb

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

(ja, das ist falsch, wenn Sie die gleiche Datenbank mit verschiedenen Schemata sowohl für Entwickler und Test durchzuführen, dies jedes Mal, beide Datenbanken fallen würden Sie die Unit-Tests laufen!)

Ich schreibe Patches tatsächlich begonnen. die erste für die Indizes Methoden in dem Adapter war, die nicht über die search_path mit dupliziert Indizes in einigen Bedingungen enden scherte, dann begann ich mit dem Rest zu verletzen und am Ende abandonning die Idee Schemata verwenden: Ich wollte bekommen mein app getan, und ich habe nicht die zusätzliche Zeit benötigt, um die Probleme zu beheben ich mit Schemata hatte.

Andere Tipps

Ich bin mir nicht sicher, ob ich verstehe, was Sie genau sind gefragt, aber Rake wird erwartet, dass die Version des Rails-Schemas in die schema_info Tabelle zu aktualisieren. Überprüfen Sie Ihre database.yml Konfigurationsdatei, das ist, wo Rake werden versuchen, die Tabelle finden zu aktualisieren.

Ist es eine Möglichkeit, dass Sie zu einem neuen Postgres Schema migrieren und Harke zeigen immer noch auf den alten? Ich bin nicht sicher, dann, dass eine Standard-Rails Migration ist das, was Sie brauchen. Es könnte sein, am besten Ihre eigene Rake Aufgabe zu erstellen, statt.

Edit: Wenn Sie Referenzierung zwei verschiedene Datenbanken oder Postgres-Schemata, Rails dies nicht in Standard-Migrationen unterstützt. Rails übernimmt eine Datenbank, so Migrationen von einer Datenbank zur anderen ist in der Regel nicht möglich. Beim Ausführen von „rake db: migrate“ es bei der variablen RAILS_ENV Umgebung tatsächlich sieht den richtigen Eintrag in database.yml zu finden. Wenn Harke der Migration Blick auf der „Entwicklung“ Umwelt und Datenbank-Konfiguration von database.yml beginnt, wird erwartet, dass es zu dieser Umgebung am Ende der Migration zu aktualisieren.

Also, werden Sie wahrscheinlich müssen dies tun, von außerhalb der Schienen stapeln, wie Sie nicht zwei Datenbanken zur gleichen Zeit innerhalb Rails verweisen können. Es gibt Versuche, Plugins dies zu ermöglichen, aber sie sind majorly Hacky und funktionieren nicht richtig.

Sie können mit pg_power . Es bietet zusätzliche DSL für Migration PostgreSQL-Schemata zu erstellen und nicht nur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top