Ruby on Rails: ajout de colonnes de base de données existante
J'obtiens une erreur:
SQLite3::SQLException: no such column: ideas.list_id:
SELECT "ideas".* FROM "ideas"
WHERE "ideas"."list_id" = 2
Mais j'ai ajouté
t.integer :list_id
à ma db fichier de migration:
class CreateIdeas < ActiveRecord::Migration
def change
create_table :ideas do |t|
t.string :name
t.text :description
t.string :picture
t.timestamps
end
add_foreign_key :ideas, :lists
end
end
qui m'a donné ceci:
class CreateIdeas < ActiveRecord::Migration
def change
create_table :ideas do |t|
t.string :name
t.text :description
t.string :picture
t.integer :list_id
t.timestamps
end
add_foreign_key :ideas, :lists
end
end
et ensuite j'ai tapé
rake db:migrate
Aucune idée pourquoi je serais une erreur en disant: il n'y a pas de colonne? Je suis encore nouveau pour Reurs. Dois-je ajouter une colonne d'une autre façon?
Grâce
Vous devez vous connecter pour publier un commentaire.
Comme Speransky suggéré, vous ne devriez jamais modifier vieux fichiers de migration. Plutôt, vous devriez créer une nouvelle migration qui ajoute de la colonne souhaitée. Par exemple, dans ce cas, vous devez exécuter la commande suivante dans votre application afin de créer la nouvelle migration:
Et Rails de pourrait générer le fichier de migration automatiquement et la seule chose qui reste à faire est d'exécuter
rake db:migrate
.Si vous insistez sur la modification de l'ancien fichier de migration, vous pouvez ajouter de la colonne que vous avez et exécutez la commande suivante:
Qui va détruire votre base de données actuelle, créez-en un et de l'exécution de toutes les migrations (qui comprendra une nouvelle colonne).
Si vous souhaitez ajouter une nouvelle colonne à une existe pas de base de données, vous devez utiliser
rails generate migration
. Ainsi, vous pouvez essayerrails generate migration add_list_id_to_ideas list_id:integer
et ensuite utiliserrake db:migrate
à commettre ce changement.Vous ne devez pas ajouter de nouvelles lignes à vieux migrations. La Migration est une étape de la construction de la base de données. Et le numéro de la dernière exécution de la migration est stocké dans
schema
, et il ne sera pas courir ou à refaire si vous utilisez utiliserarake db:migrate
. Si vous exécutez la migration avec la création de la table avant, alors vous devriez créer de nouveaux migration, où vous pouvez utiliseradd_column
méthode.migration de nom de fichier a la date codée en son nom afin de rails exécuter cette migration de l'un et de ne pas l'exécuter à nouveau, sauf si vous effectuez une restauration
et voici venir la magie de la migration de vous mettre en db avec des petits pas, donc pas besoin de mettre à jour une migration après l'exécution de rake db:migrate , vous devez faire une nouvelle migration de faire le changement que vous voulez pour votre db schéma
et n'oubliez pas de
supprimer l'ajout d'une ligne de formulaire de l'ancien fichier de migration car il pourrait déclencher des erreurs si vous avez décidé de reprendre cette migration
Rails 4.0 moyen facile de d'ajouter un ou plusieurs colonne
https://gist.github.com/pyk/8569812
Vous pouvez également le faire ..
rails g migration add_column_to_users list_id:string
puis
rake db:migrate
aussi
add :list_id
attribut dans votre contrôleur utilisateur ;pour plus de détails consultez http://guides.rubyonrails.org/active_record_migrations.html
Si vous avez déjà des fichiers dans votre migrer dossier, vous pouvez simplement ajouter une colonne que vous voulez(il suffit de taper le code), supprimer développement.sqlite ou ce que représente votre fichier de base de données, et d'exécuter rake db:migrate.
Il va ensuite créer un nouveau fichier sqlite avec une nouvelle colonne dans la table, et vous pouvez le vérifier dans le schéma.rb
Donc, en gros, tout ce que vous avez semble bon, sauf que vous n'avez pas de supprimer votre fichier de base de données.
Faire ce qui semble le plus facile pour moi, tout bien que vous perdrez tous les fichiers dans votre base de données. Si vous êtes juste de tester et de développer application Rails, cela fonctionne.
Quelqu'un peut-il commenter si il ya quelque chose de mal avec cette approche, en plus de ce que j'ai écrit?
Edit: en fait j'ai trouvé une réponse à ce sujet ici
L'édition Existant Rails Migrations est une bonne idée?