Ruby on Rails - миграция рейка sqlite 3 без обновления базы данных - PullRequest
0 голосов
/ 19 марта 2012

Я использую RoR (3.2.2) и SQLite 3 (1.3.5).Когда я изначально создаю модель, я могу успешно создать базу данных.Тем не менее, всякий раз, когда я пытаюсь использовать генератор миграции, кажется, что нет никаких проблем в командной строке (без ошибок), но когда я проверяю базу данных, ничего не обновляется и не изменяется.

Например, я создаю этобаза данных:

$ rails generate model User name:string email:string

db / migrate / [timestamp] _create_users.rb

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

И я запускаю миграцию:

$ bundle exec rake db:migrate

Пока все хорошо,Я проверяю свою базу данных, используя SQLite Database Browser, и все выглядит так, как должно.

Затем, если я хочу добавить индекс:

$ rails generate migration add_index_to_users_email

db / migrate / [timestamp] _add_index_to_users_email.rb

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

Я запускаю миграцию:

$ bundle exec rake db:migrate

И командная строка дает мне следующее:

bundle exec rake db: migrate == AddIndexToUsersEmail: миграция========================================================== AddIndexToUsersEmail: перенесено (0.0000s) ========================================

Однако, когда я проверяюмоя база данных с использованием SQLite Database Browser не обновляется.Я получаю те же результаты, если пытаюсь добавить новые столбцы в таблицу и т. Д. Единственный способ выполнить миграцию - это обновить базу данных вручную с помощью браузера баз данных SQLite.Любая помощь в том, почему он не работает через Rails и командная строка, будет принята с благодарностью.

Вот мой gemfile:

source 'https://rubygems.org'

gem 'rails', '3.2.2'
gem 'bootstrap-sass', '2.0.0'

group :development, :test do
gem 'sqlite3', '1.3.5'
gem 'rspec-rails', '2.8.1'
gem 'annotate', '~> 2.4.1.beta'
end

group :assets do
gem 'sass-rails',   '3.2.4'
gem 'coffee-rails', '3.2.2'
gem 'uglifier', '1.2.3'
end

gem 'jquery-rails', '2.0.0'

group :test do
gem 'capybara', '1.1.2'
end

group :production do
gem 'pg', '0.12.2'
end

Database.yml

development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000

test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000

production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000

Пример успешного добавления столбца:

 rails generate migration add_password_digest_to_users password_digest:string
  invoke  active_record
  create    db/migrate/20120318235656_add_password_digest_to_users.rb
 $ subl db/migrate/[timestamp]_add_password_digest_to_users.rb
 $ bundle exec rake db:migrate
 ==  AddPasswordDigestToUsers: migrating =======================================
 -- add_column(:users, :password_digest, :string)   -> 0.0008s
 ==  AddPasswordDigestToUsers: migrated (0.0009s) ==============================

Пример неудачного добавления столбца:

 $ rails generate migration add_remember_token_to_users
  invoke  active_record
  create    db/migrate/20120319010623_add_remember_token_to_users.rb
 $ subl db/migrate/[timestamp]_add_remember_token_to_users.rb
 $ bundle exec rake db:migrate
 ==  AddRememberTokenToUsers: migrating ========================================
 ==  AddRememberTokenToUsers: migrated (0.0000s) ===============================

Обратите внимание, что при сбое при обновлении базы данных время миграции равно нулю.Я не уверен, что я делаю неправильно.Заранее спасибо за любые предложения.

Ответы [ 3 ]

4 голосов
/ 29 августа 2012

Я решил проблему отмены последней миграции с помощью

rails destroy migration add_index_to_users_email

Затем я закрыл свои терминалы, чтобы убедиться, что все соединения БД были закрыты, затем я запустил

rake db:reset 

Наконец, снова выполняя те же команды

rails generate migration add_index_to_users_email

Обновление файла с тем же содержимым и запуск

rake db:migrate

Все те же команды и файлы, которые раньше не работали, теперь работают вообще (для меня).

Надеюсь, это сработает и у вас.

0 голосов
/ 19 марта 2012

Я думаю, что происходит, если вы получаете немного неправильный синтаксис (это безумно сложно), тогда вы получаете пустую миграцию, которая ничего не делает.

Я бы дважды проверил, что в самом файле миграции есть столбец добавления.Я часто заканчиваю тем, что вручную вставляю фактические изменения (или вверх / вниз).

Как говорит Харрисон, добавление индекса является более тонким - поскольку вы уверены, что оно не будет добавлено, если вы обновите sqlite borwser,Примеры, которые вы дали, которые работали ... должны добавить столбцы ...

0 голосов
/ 19 марта 2012

Вывод, который вы опубликовали в примере добавления индекса, показывает, что миграция действительно выполняется ... но вы сообщаете, что на самом деле ничего не происходит.Попробуйте bundle exec rake:db rollback (с необязательным STEP=n, чтобы вернуться более чем на один шаг назад).Это действительно должно "просто работать", и случай индекса может быть немного неуловимым - попробуйте добавить столбец или что-то (что вы сказали, что сделали, но, чтобы быть уверенным).Это действительно не работает?Как вы можете сказать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...