web-dev-qa-db-fra.com

Création de tables et problèmes avec la clé primaire dans Rails

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
45
Hedley Quintana

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
84
Bater Chen

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.

29
Thomas

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
2
Jared Menard