Миграция add_index завершается с ошибкой «Аргумент вне диапазона» - PullRequest
3 голосов
/ 15 января 2011

Я пытаюсь дублировать (работающее!) Приложение Rails 3 / MySql на другом компьютере.Я создал schema.rb и data.yml, затем использовал db: schema: load и db: data: load, и все это работало отлично, за исключением одной вещи.У меня было несколько индексов в моих таблицах, и rake не смог их создать - мне пришлось закомментировать их из schema.rb, чтобы они сгенерировались, поэтому я попытался перенести их в миграцию (так, как они были созданы воригинальное приложение!) и грабли еще умерли.Вот сообщение об ошибке:

O:\Development\myapp>rake db:migrate
rake aborted!
An error has occurred, all later migrations canceled:

argument out of range

C:/Ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6-x86-mingw32/lib/active_record/connection_adapters/mysql2_adapter.rb:446:in `utc'
C:/Ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6-x86-mingw32/lib/active_record/connection_adapters/mysql2_adapter.rb:446:in `each'
C:/Ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6-x86-mingw32/lib/active_record/connection_adapters/mysql2_adapter.rb:446:in `indexes'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:406:in `index_name_exists?'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:343:in `add_index'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:383:in `block in method_missing'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:359:in `block in say_with_time'
C:/Ruby/lib/ruby/1.9.1/benchmark.rb:294:in `measure'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:359:in `say_with_time'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:379:in `method_missing'O:/Development/codenotes/db/migrate/20110114212538_add_notes_index.rb:11:in `up'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:312:in `block in migrate'
C:/Ruby/lib/ruby/1.9.1/benchmark.rb:294:in `measure'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:312:in `migrate'
C:in `migrate'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:537:in `block (2 levels) in migrate'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:613:in `call'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:613:in `ddl_transaction'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:536:in `block in migrate'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:523:in `each'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:523:in `migrate'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:433:in `up'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/migration.rb:415:in `migrate'
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.3/lib/active_record/railties/databases.rake:142:in `block (2 levels) in <top (required)>'
C:/Ruby/lib/ruby/1.9.1/rake.rb:634:in `call'
C:/Ruby/lib/ruby/1.9.1/rake.rb:634:in `block in execute'
C:/Ruby/lib/ruby/1.9.1/rake.rb:629:in `each'
C:/Ruby/lib/ruby/1.9.1/rake.rb:629:in `execute'
C:/Ruby/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain'
C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain'
C:/Ruby/lib/ruby/1.9.1/rake.rb:581:in `invoke'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `each'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
C:/Ruby/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
C:/Ruby/lib/ruby/1.9.1/rake.rb:1992:in `run'
C:/Ruby/bin/rake:31:in `<main>'

Вот ошибочная миграция:

class AddNotesIndex < ActiveRecord::Migration
  def self.up
        add_index :users, :email,                :unique => true
        add_index :users, :reset_password_token, :unique => true
        add_index :users, :confirmation_token,   :unique => true
        add_index :users, :unlock_token,         :unique => true
  end

  def self.down
        remove_index :users, :email,                :unique => true
        remove_index :users, :reset_password_token, :unique => true
        remove_index :users, :confirmation_token,   :unique => true
        remove_index :users, :unlock_token,         :unique => true
  end
end

Это точно такой же код, который я использовал для создания индексов в исходном приложении.Насколько я могу судить, на этом компьютере у меня точно такая же среда - Ruby 1.9.2, Rails 3.0.3, mysql2 0.2.6 x86-mingw32, MySQL 5.1.41.Я даже скопировал поверх того же libmysql.dll.Я в тупике.

РЕДАКТИРОВАТЬ

Ха-ха, я тупой.Я обновлял libmysql.dll в MySQL \ MySQL Server 5.1 \ bin, но не в Ruby \ bin.Как только я скопировал последнюю версию в Ruby \ bin, все работало нормально.Спасибо всем!

1 Ответ

1 голос
/ 20 января 2011

Кажется, у многих людей есть эта проблема, включая меня.Ошибка, кажется, происходит из самоцвета mysql2.Так что у меня получилось:

  1. Установить mysql gem
  2. Изменить с mysql2 на mysql в Gemfile
  3. Изменить адаптер с mysql2 на mysql в database.yml

И затем возможно удалить последнюю созданную таблицу, если она была создана в той же миграции, что и вызов add_index, так как он попытается создать ее еще раз.

Возможно, это больше обходной путь, чемрешение, но я не нашел лучшего способа.

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