Lorsque j'essaie d'exécuter le code suivant dans Rails en utilisant Mysql2 comme gestionnaire de base de données:
rake db:migrate
J'obtiens l'erreur suivante:
rake aborted!
"Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL:"
Pourquoi est-ce que j'obtiens cette erreur, si la clé primaire dans une table par défaut n'est PAS "nulle"?
Code de migration, cependant:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string "first_name"
t.timestamps
end
end
end
J'ai eu un même problème avant, et j'ai résolu selon ici https://github.com/Rails/rails/pull/13247#issuecomment-32425844
Avec Rails 2.3.5, MySQL version 5.7.9 et mysql gem, vous devez avoir ce bit comme initialiseur dans config/initializers/abstract_mysql_adapter.rb:
class ActiveRecord::ConnectionAdapters::MysqlAdapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end
Pour mysql2, ce devrait être config/initializers/abstract_mysql2_adapter.rb:
class ActiveRecord::ConnectionAdapters::Mysql2Adapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end
Depuis la page de changement de rupture de mysql 5.7:
Les colonnes d'une PRIMARY KEY doivent être NOT NULL, mais si elles sont déclarées explicitement comme NULL, aucune erreur n'a été générée. Maintenant, une erreur se produit. Par exemple, une instruction telle que CREATE TABLE t (i INT NULL PRIMARY KEY) est rejetée. La même chose se produit pour des instructions ALTER TABLE similaires. (Bogue n ° 13995622, bogue n ° 66987, bogue n ° 15967545, bogue n ° 16545198)
Changements dans MySQL 5.7.3 (2013-12-03, jalon 13)
Ce problème a été corrigé il y a 3 mois. Je ne sais pas de quelle version Rails il fera partie
le patch singe est ici
EDIT: Cela fait plus d'un an que ce correctif a été fusionné dans master. Il doit donc faire partie de la dernière version de Rails.
EDIT: En effet, le commit qui corrige cela peut être trouvé sur: https://github.com/yahonda/Rails/commit/ b6655885ef13cf8d1705dc9b5232846f0207febd , et montre que le correctif est inclus dans v4.2.0.beta1, v4.1.6.rc1, v4.1.5, v4.1.4, v4.1.3, v4.1.2, v4.1.2.rc3, v4.1.2.rc2, v4.1.2.rc1, v4.1.1, v4.1.0, v4.1.0.rc2, v4.1.0.rc1, v4.1.0.beta2, v4.1.0.beta1
. Si la mise à niveau vers au moins v4.1.0 est une option pour vous, cela devrait résoudre le problème.
J'ai eu ce problème en exécutant une application Rails 4.0.x en utilisant mysql 5.7.x. J'ai pu le résoudre en passant à Rails 4.2.x et en mettant à niveau mes joyaux.
(Je suis sûr que ces fichiers gemmes ont besoin de travail, mais j'espère qu'ils sont toujours utiles)
Ancien Gemfile
source 'https://rubygems.org'
Ruby '2.0.0'
# Bundle Edge Rails instead: gem 'Rails', github: 'Rails/rails'
gem 'Rails', '4.0.13'
gem 'mysql2'
# Use Unicorn as the app server
# gem 'Unicorn'
gem 'sidekiq'
gem 'sinatra'
gem 'whenever'
gem 'thin'
gem 'faye'
gem 'faye-websocket'
#pdf generation
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
# Assets
gem 'backbone-on-Rails', '~> 0.9.9'
gem 'coffee-Rails', '~> 4.0.1'
gem 'coffee-script-source', '=1.8.0'
gem 'ejs' # uses templates for backbone
gem 'jquery-Rails'
gem 'jquery-ui-Rails'
gem 'neat'
gem 'sass-Rails', '~> 4.0.3'
gem 'therubyracer'
gem 'turbolinks'
gem 'uglifier', '>= 1.3.0'
gem 'active_model_serializers', '0.8.3'
gem 'acts_as_list'
gem 'bcrypt-Ruby', '~> 3.1.2'
gem 'bootstrap-sass', '~> 3.2.0.0'
gem 'bower-Rails'
gem 'carrierwave'
gem 'enumerize'
gem 'embedly' # Url to Attachment Processing
gem 'fancybox2-Rails', '~> 0.2.4'
gem 'flamegraph'
gem 'fog' # s3 storage
gem 'globalize' # I18n for tagging, etc.
gem 'globalize-accessors'
gem 'i18n-tasks', '~> 0.8.3'
gem 'hirb'
gem 'kaminari'
gem 'nokogiri'
gem 'newrelic_rpm'
gem 'select2-Rails' # Token Fields
gem 'twilio-Ruby'
gem 'Rails_autolink' # Convert urls to links
gem 'redis', '3.2.1'
gem 'rest-client'
gem 'rmagick'
gem 'rubyzip', :require => 'Zip' # Zip files together
gem 'unf'
gem 'mailgun-Ruby', '~>1.0.3', require: 'mailgun'
# Deployments
gem 'mina'
group :doc do
gem 'sdoc'
end
group :test do
gem 'rspec-Rails', "= 2.14.2"
gem 'shoulda-matchers', :require => false
gem 'simplecov', '~> 0.9.2'
gem 'database_cleaner'
gem 'codeclimate-test-reporter', require: nil
end
group :development, :test do
gem 'quiet_assets'
gem 'factory_girl_Rails', "~> 4.0"
gem 'guard', '>=2.1.0'
gem 'guard-rspec', '= 4.2.9'
gem 'spring', '1.3.6'
gem 'spring-commands-rspec'
gem 'foreman'
end
Nouveau Gemfile
source 'https://rubygems.org'
Ruby '2.3.0'
# Bundle Edge Rails instead: gem 'Rails', github: 'Rails/rails'
gem 'Rails', '4.2.5'
gem 'mysql2'
gem 'stackprof'
# Use Unicorn as the app server
# gem 'Unicorn'
gem 'sidekiq'
gem 'sinatra'
gem 'whenever'
gem 'thin'
gem 'faye'
gem 'faye-websocket'
#pdf generation
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
# Assets
gem 'backbone-on-Rails', '~> 0.9.9'
gem 'coffee-Rails', '~> 4.0.1'
gem 'coffee-script-source', '=1.8.0'
gem 'ejs' # uses templates for backbone
gem 'jquery-Rails'
gem 'jquery-ui-Rails'
gem 'neat'
gem 'sass-Rails', '~> 4.0.3'
gem 'therubyracer'
gem 'turbolinks'
gem 'uglifier', '>= 1.3.0'
gem 'active_model_serializers', '0.8.3'
gem 'acts_as_list'
gem 'bcrypt', '~> 3.1.2'
gem 'bootstrap-sass', '~> 3.2.0.0'
gem 'bower-Rails'
gem 'carrierwave'
gem 'enumerize'
gem 'embedly' # Url to Attachment Processing
gem 'fancybox2-Rails', '~> 0.2.4'
gem 'flamegraph'
gem 'fog' # s3 storage
gem 'globalize' # I18n for tagging, etc.
gem 'globalize-accessors'
gem 'i18n-tasks', '~> 0.8.3'
gem 'hirb'
gem 'kaminari'
gem 'nokogiri'
gem 'newrelic_rpm'
gem 'select2-Rails' # Token Fields
gem 'twilio-Ruby'
gem 'Rails_autolink' # Convert urls to links
gem 'redis', '3.2.1'
gem 'rest-client'
gem 'rmagick'
gem 'rubyzip', :require => 'Zip' # Zip files together
gem 'unf'
gem 'mailgun-Ruby', '~>1.0.3', require: 'mailgun'
gem 'rack-cors', :require => 'rack/cors'
# Deployments
gem 'mina'
group :doc do
gem 'sdoc'
end
group :test do
gem 'rspec-Rails', "= 2.14.2"
gem 'shoulda-matchers', :require => false
gem 'simplecov', '~> 0.9.2'
gem 'database_cleaner'
gem 'codeclimate-test-reporter', require: nil
end
group :development, :test do
gem 'quiet_assets'
gem 'factory_girl_Rails', "~> 4.0"
gem 'guard', '>=2.1.0'
gem 'guard-rspec', '= 4.2.9'
gem 'spring', '1.6.1'
gem 'spring-commands-rspec'
gem 'foreman'
end