Подтвердить что ты не робот

Проблема PRIMARY KEY с созданием таблиц в Rails с использованием rake db: команда migrate с mysql

Моя версия rails 4.0.0, моя версия mysql - это Ver 14.14. Распространение 5.7.9 для Win64 (x86_64). Я работаю с более старой версией рельсов, так как я получал некоторые столкновения с mysql в соответствии с моим предыдущим вопросом здесь. (отметьте Kalelc одобренный ответ для моего обращения)

при запуске

rake db:migrate 

Я получаю следующую ошибку

==  CreateUsers: migrating ====================================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDBC:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
ActiveRecord::StatementInvalid: Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Я не устанавливаю значения в NULL в моем коде, вот код

Class CreateUsers < ActiveRecord::Migration

  def up
    create_table :users do |t| 
      t.column "first_name", :string, :limit => 25 
      t.string "last_name", :limit => 50
      t.string "email", :default => "", :null => false 
      t.string "password", :limit => 40
      t.timestamps
    end
  end

  def down
    drop_table :users
  end
end

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

# lib/patches/abastract_mysql_adapter.rb
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

Я вставил этот файл в папку, которую я создал, называл патчи внутри lib моего приложения simple_cms. Я сохранил файл как "abstract_mysql_adapter.rb" как предложено в том же патче обезьяны. Я обновил среду environment.rb приложения simple_cms со следующими

require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__)

если я запустил команду rake db: migrate

rake aborted!
LoadError: cannot load such file -- C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/config/environment.rb:3:in `<top (required)>'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)

C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb - это, безусловно, путь к патчу обезьяны. Я поставил патч в неправильном месте? Что я делаю неправильно здесь, почесывая голову над этим? Извиняюсь, если это очевидно для некоторых, но я возвращаюсь к кодированию после очень длительного воздержания, и я не могу решить эту проблему. Большое спасибо заранее за помощь:)

4b9b3361

Ответ 1

Я тоже недавно столкнулся с такой же проблемой.

MySQL 5.7 больше не поддерживает нулевые значения по умолчанию для первичного ключа.

Переопределяя исходное значение по умолчанию для первичных ключей в MySql, вы можете решить свою проблему.

В config/initializers/abstract_mysql_adapter.rb:

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

Для mysql2 это должно быть config/initializers/abstract_mysql2_adapter.rb:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

Ответ 2

Не повезло с решениями выше (My env: Rails 3.0.20, MySQL 5.7.13, Ruby 1.9.3p551). Было возможно обойти его, перезаписав класс ActiveRecord::ConnectionAdapters::ColumnDefinition. См. Ниже:

class ActiveRecord::ConnectionAdapters::ColumnDefinition
  def sql_type
    type.to_sym == :primary_key ? 'int(11) auto_increment PRIMARY KEY' : base.type_to_sql(type.to_sym, limit, precision, scale) rescue type
  end 
end

Сохранено это в config/initializers/column_definition.rb

Ответ 3

Начиная с MySQL 5.7.3 первичный ключ, объявленный как NULL, выдает ошибку:

Столбцы в PRIMARY KEY должны быть NOT NULL, но если объявлено явно поскольку NULL не выдает ошибки. Теперь возникает ошибка. Например, такой как CREATE TABLE t (i INT NULL PRIMARY KEY) отклоняется. То же самое происходит для аналогичных операторов ALTER TABLE. (Ошибка № 13995622, Ошибка # 66987, ошибка # 15967545, ошибка # 16545198)

Но create_table в вашей версии Rails все еще хочет DEFAULT или NULL для PRIMARY KEY. Я решил проблему, обновив новую версию rails.

Ответ 4

У меня тоже была эта проблема (mysql 5.7.17 и Rails 4.0.0). Я исправил его, добавив file config/initializers/mysql2_adapter.rb

require 'active_record/connection_adapters/mysql2_adapter'
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

а затем в моем файле everionment.rb:

require File.expand_path('../initializers/mysql2_adapter', __FILE__)

Ответ 5

Я решил эту проблему с Rails-приложением в JRuby, над которым я работаю, обновив mysql-adapter.

Я использовал gem activerecord-jdbcmysql-adapter v1.3.14 и обновился до версии 1.3.21

Проверьте версию адаптера jdbc до того, как обезьяна исправила решение.