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

Моя версия рельсов — 4.0.0, моя версия mysql — Ver 14.14 Distrib 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

Я вставил этот файл в папку, которую я создал под названием patches внутри библиотеки моего приложения 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 определенно является путем к патчу для обезьян. Я поставил патч в неправильном месте? Что я здесь делаю не так, ломаю голову над этим? Извините, если это очевидно для некоторых, но я возвращаюсь к кодированию после очень долгого воздержания, и я не могу решить эту проблему. Заранее большое спасибо за помощь :)


person Aerosewall1    schedule 16.11.2015    source источник
comment
Попробуйте отредактировать свой обезьяний патч на "int(11) auto_increment PRIMARY KEY NOT NULL"   -  person Undo    schedule 16.11.2015
comment
Эй, отменить, спасибо за быстрый ответ, только что попробовал, и я все еще получаю ту же ошибку загрузки.   -  person Aerosewall1    schedule 16.11.2015
comment
нужно ли сохранить этот патч обезьяны в библиотеке приложения или в библиотеке рельсов   -  person Aerosewall1    schedule 16.11.2015
comment
вам может повезти с перемещением файла: lib/patches/abastract_mysql_adapter.rb в config/initializers/abastract_mysql_adapter.rb - но если вы только изучаете рельсы, почему бы не использовать sqlite (я также предпочитаю postgres вместо mysql, особенно если вы в конечном итоге размещаете свои приложения на heroku)   -  person house9    schedule 16.11.2015
comment
Спасибо, house9, я только что попробовал ваше предложение, и я получаю точно такое же сообщение, но на этот раз о том, что он не может загрузить файл в инициализаторе, хотя я изменил путь в environment.rb. Здесь действительно застрял. Я отвечаю на ваш вопрос. Я использую mysql, так как это рекомендуемая версия для учебных пособий Lynda, которым я следую. поэтому, чтобы иметь возможность точно следовать за учителем, я подумал, что лучше всего использовать точно такую ​​​​же настройку, как он предлагает.   -  person Aerosewall1    schedule 16.11.2015
comment
только что попробовал bundle exec rake db:migrate и это тоже не сработало, та же ошибка   -  person Aerosewall1    schedule 16.11.2015
comment
Включение вашего патча обезьяны в инициализаторы сработало для меня. Рельсы 3.2, MySQL 5.7.10.   -  person Kris    schedule 14.01.2016
comment
Я знаю, что это старая тема, но проблема действительно в опечатке. Вы пытаетесь загрузить abstract..., но файл называется abAstract...   -  person Gabriel F. Engel    schedule 22.01.2016
comment
о, спасибо, вы будете исследовать: D   -  person Aerosewall1    schedule 22.11.2017


Ответы (5)


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

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
person paljoshi    schedule 01.01.2016
comment
Спасибо, это имеет смысл, а) я не определил тип по адресу, хорошие усилия для определения этого, и я также использую mysql2, поэтому я предполагаю, что вызов lib/patches/abastract_mysql_adapter.rb не будет работать. даже не подумал об этом. Спасибо :) - person Aerosewall1; 23.01.2016
comment
Это правильный ответ. Не вижу, как это низкое качество. - person Subimage; 14.03.2016
comment
Можно просто запатчить class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter , как описано, независимо от фактического адаптера. - person niels; 12.10.2016
comment
Я также сталкиваюсь с той же проблемой при попытке миграции БД. пожалуйста, дайте мне знать путь к файлу config/initializers/abstract_mysql2_adapter.rb - person George Varghese; 04.12.2016
comment
Работает для Rails 3.2. - person Joshua Pinter; 01.05.2017
comment
Была такая же проблема, это решилось. Возможно, именно здесь мы пытаемся использовать более старые рельсы 4.0.2 в более новой MySQL. - person Jetblackstar; 14.05.2020
comment
ПРИМЕЧАНИЕ, это больше не работает в Rails 5.1. Хорошая новость заключается в том, что в Rails 5.1 типом столбца по умолчанию для первичных ключей стал bigint, но плохая новость заключается в том, что это signed вместо unsigned. И это не так просто переопределить значение по умолчанию, как вы делаете здесь. Если вы хотите, чтобы unsigned bigint было значением по умолчанию, ознакомьтесь с этой проблемой Github и покажите свою поддержку: github.com /rails/rails/issues/40967 - person Joshua Pinter; 30.12.2020

Не повезло с приведенными выше решениями (Моя среда: 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

person Andy Day    schedule 29.06.2016
comment
Это решение сработало для меня. Другие решения работали нормально для меня на schema:load, но если я запустил rails generate migration, мне была представлена ​​неинициализированная постоянная ошибка для NATIVE_DATABASE_TYPES. Ваше решение сработало без проблем. Спасибо. - person brightball; 15.06.2017
comment
Большое спасибо за это. - person Astik Anand; 20.06.2018
comment
Получение TypeError: superclass mismatch for class ColumnDefinition на рейк-тестах. Я пропустил что-то глупое? - person B. Shea; 15.11.2018

У меня тоже была эта проблема (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

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

require File.expand_path('../initializers/mysql2_adapter', __FILE__)
person TsaiKoga    schedule 20.05.2017
comment
ПРИМЕЧАНИЕ, это больше не работает в Rails 5.1. Хорошая новость заключается в том, что в Rails 5.1 типом столбца по умолчанию для первичных ключей стал bigint, но плохая новость заключается в том, что это signed вместо unsigned. И это не так просто переопределить значение по умолчанию, как вы делаете здесь. Если вы хотите, чтобы unsigned bigint было значением по умолчанию, ознакомьтесь с этой проблемой Github и покажите свою поддержку: github.com /rails/rails/issues/40967 - person Joshua Pinter; 30.12.2020

Начиная с 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. Я решил проблему, обновив до более новой версии рельсов.

person H6.    schedule 23.11.2015
comment
Большое спасибо, высокий 6. :) На самом деле я вернулся к более старой копии рельсов из-за некоторых столкновений с рельсами, рельсами и mysql. Я посмотрю, смогу ли я найти версию, в которой я не получаю это столкновение, как описано здесь [stackoverflow.com/questions/31766656/ - person Aerosewall1; 25.11.2015
comment
Могу я спросить, какую версию рельсов вы используете? Так что я могу обновить до этой версии. Спасибо - person Aerosewall1; 04.12.2015

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

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

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

person Mateus Q.    schedule 06.12.2016