Question

J'ai une migration qui exécute un script SQL pour créer un nouveau schéma Postgres. Lors de la création d'une nouvelle base de données dans Postgres, il crée par défaut un schéma appelé "public", qui est le schéma principal que nous utilisons. La migration pour créer le nouveau schéma de base de données semble fonctionner correctement. Cependant, le problème survient après son exécution. Lorsque rails tente de mettre à jour la table 'schema_info' sur laquelle il s'appuie, il dit qu'il n'existe pas, comme si c'était le cas. cherchez-le dans le nouveau schéma de base de données et non dans le schéma par défaut "public" où la table est réellement.

Quelqu'un sait-il comment je peux dire à rails de consulter le schéma "public" de cette table?

Exemple d'exécution de code SQL: ~

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

Erreur en cours: ~

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

Merci de votre aide

Chris Knight

Était-ce utile?

La solution

Cela dépend de votre migration, de votre fichier database.yml et de ce que vous essayez exactement. Quoi qu'il en soit, plus d'informations sont nécessaires, modifiez les noms si vous devez et postez un exemple database.yml et la migration. la migration change-t-elle le chemin search_path pour l'adaptateur par exemple?

Mais sachez qu’en général, les schémas rails et postgresql ne fonctionnent pas bien (encore?).

Il y a quelques endroits qui ont des problèmes. Essayez de construire et une application qui utilise une seule base de données pg avec 2 schémas autres que ceux par défaut, l'un pour dev et l'autre pour test et m'en parler. (à partir de là, je peux déjà vous dire que vous allez vous brûler)

Peut-être que ça a été corrigé depuis la dernière fois que j'ai joué avec, mais quand je vois http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-table-name break-when-non-default-schéma-est-utilisé ou ce http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list ou ceci dans postgresql_adapter.rb

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

(oui, c'est faux si vous utilisez la même base de données avec des schémas différents pour dev et test, les deux seront perdues à chaque fois que vous exécuterez les tests unitaires!)

J'ai effectivement commencé à écrire des correctifs. la première concernait les méthodes d'index de l'adaptateur qui ne se souciaient pas de search_path et finissait par avoir des index dupliqués dans certaines conditions, puis j'ai commencé à me blesser et à abandonner l'idée d'utiliser des schémas: je voulais obtenir mon application est terminée et je n'ai pas eu le temps supplémentaire nécessaire pour résoudre les problèmes rencontrés lors de l'utilisation de schémas.

Autres conseils

Je ne suis pas sûr de bien comprendre ce que vous demandez, mais rake s'attend à mettre à jour la version du schéma Rails dans la table schema_info. Vérifiez votre fichier de configuration database.yml, c’est là que rake cherchera la table à mettre à jour.

Est-il possible que vous migriez vers un nouveau schéma Postgres et que rake pointe toujours vers l’ancien? Je ne suis donc pas sûr qu'une migration Rails standard soit ce dont vous avez besoin. Il peut être préférable de créer votre propre tâche de rake à la place.

Éditer: si vous référencez deux bases de données différentes ou des schémas Postgres, Rails ne le prend pas en charge dans les migrations standard. Comme Rails suppose une base de données, les migrations d’une base à l’autre ne sont généralement pas possibles. Lorsque vous exécutez "rake db: migrate" En fait, il examine la variable d'environnement RAILS_ENV pour trouver l'entrée correcte dans database.yml. Si rake commence la migration en examinant le "développement" configuration de l’environnement et de la base de données de database.yml, il est prévu de mettre à jour cet environnement à la fin de la migration.

Ainsi, vous devrez probablement le faire en dehors de la pile Rails, car vous ne pouvez pas référencer deux bases de données simultanément dans Rails. Il y a des tentatives de plugins pour permettre cela, mais ils sont principalement hacky et ne fonctionnent pas correctement.

Vous pouvez utiliser pg_power . Il fournit une DSL supplémentaire pour la migration afin de créer des schémas PostgreSQL et pas seulement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top