web-dev-qa-db-fra.com

La migration de Rails ne change pas schema.rb

J'ai une migration Rails qui n'est pas appliquée à mon schema.rb. La migration devrait créer un tableau:

class CreateUserGraphs < ActiveRecord::Migration
  def change
    create_table :user_graphs do |t|
      t.string :name
      t.string :content
      t.integer :user_id
      t.string :type_id
      t.integer :upload_id

      t.timestamps
    end

    add_index :user_graphs, [:user_id, :created_at]
  end
end

J'ai fait db: reset. Ensuite, j'ai essayé rake db: migrate: up VERSION = 123123123 (c'est le numéro de migration). Je suis dans mon environnement "dev". 

Pourquoi la migration n'affecte-t-elle pas schema.rb?

21
Don P

De la documentation :

La tâche rake db:reset va supprimer la base de données, la recréer et y charger le schéma actuel.

Ce n'est pas la même chose que d'exécuter toutes les migrations. Il utilisera uniquement le contenu du fichier schema.rb actuel. Si une migration ne peut pas être annulée, 'rake db: reset' peut ne pas vous aider. Pour en savoir plus sur le vidage du schéma, voir 'Schéma dumping et vous.'

Donc rake db:reset => db:drop db:create db:schema:load db:seed

Pour exécuter toutes les migrations, utilisez: rake db:drop db:create db:migrate

Or db:migrate:reset => rake db:drop db:create db:migrate

Référence

44
Vucko

J'ai eu le même problème ... il s'est avéré que c'est parce que j'ai modifié le nom de mon fichier de migration pour qu'il soit plus net. Assurez-vous de ne pas supprimer l'horodatage dans le titre du fichier de migration comme je l'ai fait. 

J'ai supprimé le fichier de migration, le modèle, le contrôleur et les tests associés, puis j'ai régénéré le contrôleur et le modèle qui ont résolu le problème.

1
Mia Genovese

J'ai eu le même problème. Je travaille dans un environnement de développement (avec Passenger et Apache). Les environnements de production et de développement utilisent la même base de données. 

Lorsque j'ai exécuté rake db:migrate, la base de données a été modifiée, mais le schéma n'a pas été mis à jour. Ensuite, je lance rake db:migrate Rails_ENV=development, et maintenant le schéma a été mis à jour. 

On dirait que Rails/rake sont confus à propos de mon environnement. Passager définit un environnement de développement pour ce site, mais rake about dit "Production de l'environnement". 

1
Jussi Hirvi

Les «versions» des migrations se font via des horodatages. Rails vérifie les migrations à exécuter en comparant l'horodatage de la dernière migration et en recherchant d'éventuelles nouvelles.

Si la version de votre nouvelle migration est 123123123, elle ne sera pas exécutée car ce nombre n'est pas supérieur à l'horodatage actuel (par exemple, 20131209170300).

1
sevenseacat

D'abord, vous essayez de réduire votre migration

rake db: migrate: down VERSION = 20180605141404 # "VERSION = 20180605141404 votre version de migration"

Et encore votre migration

rake db: migrate: up VERSION = 20180605141404 # "VERSION = 20180605141404 votre version de migration"

1
Raj

Trouver un moyen d'obtenir une description de l'erreur . Couru rake db: migrate: reset

`SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "rooms" ADD "priority" integer NOT NULL/usr/local/rvm/gems/Ruby-2.2.1/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize`'
0
Pavel Murnikov