MySQL 在 Rails 中使用主键创建表和问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21075515/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Creating tables and problems with primary key in Rails
提问by Hedley Quintana
When I try to run the following code in Rails using Mysql2 as database manager:
当我尝试使用 Mysql2 作为数据库管理器在 Rails 中运行以下代码时:
rake db:migrate
I obtain the following error:
我收到以下错误:
rake aborted!
"Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL:"
Why do I get this error, if the primary key in a table by default is NOT "null"?
如果默认情况下表中的主键不是“空”,为什么会出现此错误?
Migration code, however :
但是,迁移代码:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string "first_name"
t.timestamps
end
end
end
回答by Bater Chen
I had a same problem before, and I solved according to here https://github.com/rails/rails/pull/13247#issuecomment-32425844
我之前遇到过同样的问题,我根据这里解决了 https://github.com/rails/rails/pull/13247#issuecomment-32425844
With Rails 2.3.5, MySQL version 5.7.9 and mysql gem you need to have this bit as an initializer in config/initializers/abstract_mysql_adapter.rb:
class ActiveRecord::ConnectionAdapters::MysqlAdapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end
For mysql2, it should be config/initializers/abstract_mysql2_adapter.rb:
class ActiveRecord::ConnectionAdapters::Mysql2Adapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end
在 Rails 2.3.5、MySQL 5.7.9 和 mysql gem 中,您需要在 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
回答by Thomas
From the mysql 5.7 breaking change page:
从 mysql 5.7 重大更改页面:
Columns in a PRIMARY KEY must be NOT NULL, but if declared explicitly as NULL produced no error. Now an error occurs. For example, a statement such as CREATE TABLE t (i INT NULL PRIMARY KEY) is rejected. The same occurs for similar ALTER TABLE statements. (Bug #13995622, Bug #66987, Bug #15967545, Bug #16545198)
PRIMARY KEY 中的列必须为 NOT NULL,但如果显式声明为 NULL 不会产生错误。现在出现错误。例如,诸如 CREATE TABLE t (i INT NULL PRIMARY KEY) 之类的语句被拒绝。类似的 ALTER TABLE 语句也会发生同样的情况。(错误 #13995622、错误 #66987、错误 #15967545、错误 #16545198)
Changes in MySQL 5.7.3 (2013-12-03, Milestone 13)
MySQL 5.7.3 中的变化(2013-12-03,里程碑 13)
This issue was fixed3 months ago. I don't know what Rails version it's going to be part of
此问题已于3 个月前修复。我不知道它将成为哪个 Rails 版本的一部分
monkey patch is here
猴子补丁在这里
EDIT:It's been more than a year that this fix was merged into master. So, it must be part of the last version of Rails.
编辑:此修复程序合并到 master 已经一年多了。因此,它必须是最新版本的 Rails 的一部分。
EDIT:Indeed, the commit that fixes this can be found at: https://github.com/yahonda/rails/commit/b6655885ef13cf8d1705dc9b5232846f0207febd, and shows that the fix is included in 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
. If upgrading to at least v4.1.0 is an option for you, then it should fix the problem.
编辑:确实,可以在以下位置找到修复此问题的提交:https: //github.com/yahonda/rails/commit/b6655885ef13cf8d1705dc9b5232846f0207febd,并显示修复程序包含在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
. 如果升级到至少 v4.1.0 是您的一个选择,那么它应该可以解决问题。
回答by Jared Menard
I had this issue running a rails 4.0.x app using mysql 5.7.x. I was able to fix it by upgrading to rails 4.2.x and upgrading my gems.
我在使用 mysql 5.7.x 运行 rails 4.0.x 应用程序时遇到了这个问题。我能够通过升级到 rails 4.2.x 并升级我的 gems 来修复它。
(I'm sure these gemfiles need work, but hopefully they are still helpful)
(我确定这些 gemfile 需要工作,但希望它们仍然有用)
Old Gemfile
旧 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
New Gemfile
新建 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