Ruby on Rails: добавление столбцов в существующую базу данных
Я получаю сообщение об ошибке:
SQLite3::SQLException: no such column: ideas.list_id:
SELECT "ideas".* FROM "ideas"
WHERE "ideas"."list_id" = 2
Но я добавил
t.integer :list_id
в файл миграции db:
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
который дал мне это:
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
а затем я набрал
rake db:migrate
Любая идея, почему я получаю ошибку, говоря, что нет колонки? Я все еще новичок в RoR. Нужно ли добавлять столбец другим способом?
Спасибо
Ответы
Ответ 1
Как предложил Сперанский, вы никогда не должны изменять старые файлы миграции. Скорее вы должны создать новую миграцию, которая добавит нужный столбец. Например, в этом случае для создания новой миграции вы выполните следующее в своем приложении:
rails generate migration AddListIdColumnToIdeas list_id:integer
И Rails автоматически сгенерирует файл миграции, и осталось только run rake db:migrate
.
Если вы настаиваете на изменении старого файла миграции, вы можете добавить столбец, как и вы, и запустить следующее:
rake db:drop
rake db:create
rake db:migrate
Что разрушит вашу текущую базу данных, создаст новую и запустит все миграции (в которую войдет ваш новый столбец).
Ответ 2
Если вы хотите добавить новый столбец в существующую базу данных, вы должны использовать rails generate migration
. Поэтому вы можете попробовать rails generate migration add_list_id_to_ideas list_id:integer
, а затем использовать rake db:migrate
для фиксации этого изменения.
Ответ 3
Нельзя добавлять новые строки в старые миграции. Миграция - это шаг построения базы данных. И число последней выполненной миграции хранится в schema
, и она не будет запущена или переделана, если вы используете, будет использовать rake db:migrate
. Если вы запустите миграцию с созданием таблицы раньше, вам следует создать новую миграцию, где вы можете использовать метод add_column
.
Ответ 4
имя файла миграции имеет datetime, закодированное в его имени, поэтому рельсы запускают этот перенос и не запускают его снова, если вы не выполняете откаты
и здесь пришло волшебство миграции, чтобы построить вам db с небольшими шагами, поэтому нет необходимости обновлять миграцию после запуска rake db: migrate, вы должны сделать новую миграцию, чтобы выполнить изменение, которое вы хотите использовать для своей схемы db
и запомните
удалите добавленную строку из старого файла миграции, поскольку это может вызвать ошибки, если вы решили отменить эту миграцию
Ответ 5
Rails 4.0 простой способ добавить один или несколько столбцов
https://gist.github.com/pyk/8569812
Ответ 6
Если у вас уже есть файлы в папке переноса, вы можете просто добавить туда столбец (просто введите код), удалите файл development.sqlite или что-то, что представляет ваш файл db, и запустите rake db: migrate.
Затем он создаст новый sqlite файл с новым столбцом в таблице, и вы можете проверить его в schema.rb
Итак, в основном, все, что вы делали, кажется хорошим, за исключением того, что вы не удаляли свой файл базы данных.
Выполнение этого кажется самым легким для меня, все, хотя вы потеряете все файлы в своей базе данных. Если вы просто тестируете и разрабатываете приложение Rails, это работает.
Может кто-нибудь прокомментировать, если что-то не так с этим подходом, кроме того, что я написал?
Изменить: я действительно нашел ответ об этом здесь
Редактирование существующих Rails Migrations - хорошая идея?
Ответ 7
Вы также можете сделать это.
rails g migration add_column_to_users list_id: string
затем rake db: migrate
также добавить в свой пользовательский контроллер атрибут list_id;
для более подробной информации http://guides.rubyonrails.org/active_record_migrations.html