2008-09-18 24 views
2

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 par défaut, elle crée 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, mais le problème se produit après que la migration a été exécutée, lorsque rails tente de mettre à jour la table 'schema_info' sur laquelle elle s'appuie, elle dit qu'elle n'existe pas. la recherche dans le nouveau schéma de base de données et non le schéma 'public' par défaut où la table est réellement.Migration de Ruby on Rails - Créer un nouveau schéma de base de données

Est-ce que quelqu'un sait comment je peux dire aux rails de regarder le schéma «public» pour cette table?

Exemple de SQL en cours d'exécution: ~

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 d'être jeté: ~

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

Merci pour votre aide

Chris Knight

+0

vous voudrez peut-être modifier votre question pour clarifier quand vous parlez du schéma db de rails et quand vous parlez de schémas postgres. – kch

+0

aussi, en donnant des exemples et en nommant des choses utiles. une description abstraite de votre problème est plus difficile à saisir pour nous pas impliqué dans votre application. – kch

+0

Comment votre database.yml est-elle configurée? –

Répondre

5

Cela dépend de votre migration, de l'apparence de votre fichier database.yml et de ce que vous tentez de faire exactement. Quoi qu'il en soit, plus d'informations sont nécessaires changer les noms si vous devez et poster un exemple database.yml et la migration. la migration change-t-elle le search_path de l'adaptateur par exemple? Mais sachez qu'en général les rails et les schémas postgresql ne fonctionnent pas bien ensemble (encore?).

Il y a quelques endroits qui ont des problèmes. Essayez de construire et d'utiliser une seule base de données pg avec 2 schémas non-par défaut un pour le dev et un pour le test et dites-moi à ce sujet. (À partir thefollowing Je peux déjà vous dire que vous aurez brûlé)

Peut-être qu'il a été fixé depuis la dernière fois que je jouais avec elle, mais quand je vois http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used ou ce http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list ou dans ce 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 cela est faux si vous utilisez la même base de données avec différents schémas pour les deux dev et test, cela baisserait les deux bases de données chaque fois que vous exécutez les tests unitaires!)

En fait, je commencé à écrire patches. le premier était pour les méthodes d'index dans l'adaptateur qui ne se souciait pas du search_path se terminant avec des index dupliqués dans certaines conditions, puis j'ai commencé à être blessé par le reste et a fini par abandonner l'idée d'utiliser des schémas: je voulais obtenir mon application fait et je n'ai pas le temps supplémentaire nécessaire pour régler les problèmes que j'avais l'aide de schémas.

+0

Merci pour cela, c'était le search_path avait été changé mais pas remis à l'état public –

0

Je ne suis pas sûr comprendre ce que vous demandez exactement, mais, rake va s'attendre à mettre à jour la version du Rail s schéma dans la table schema_info. Vérifiez votre fichier de configuration database.yml, c'est ici 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 pas sûr alors qu'une migration standard de Rails est ce dont vous avez besoin. Il pourrait être préférable de créer votre propre tâche de rake à la place. Edit: Si vous faites référence à deux bases de données ou à des schémas Postgres différents, Rails ne prend pas en charge cette fonctionnalité dans les migrations standard. Rails suppose une base de données, de sorte que les migrations d'une base de données vers une autre ne sont généralement pas possibles. Lorsque vous exécutez "rake db: migrate", il recherche en fait la variable d'environnement RAILS_ENV pour trouver l'entrée correcte dans database.yml. Si rake démarre la migration en regardant l'environnement de développement et la configuration de la base de données depuis database.yml, il s'attend à mettre à jour cet environnement à la fin de la migration. Donc, vous aurez probablement besoin de le faire depuis l'extérieur de la pile Rails car vous ne pouvez pas référencer deux bases de données en même temps dans Rails. Il y a des tentatives de plugins pour permettre ceci, mais ils sont majorly hacky et ne fonctionnent pas correctement.

0

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