MySQL 5.7.9,Rails 3.2,mysql2 0.3.20

时间:2015-11-17 10:51:10

标签: mysql ruby-on-rails-3 mysql2

升级到MySQL 5.7.9后出现问题(在OSX 10.11 El Capitan上通过brew安装):基于Rails 3.2。*的所有遗留应用程序都停止了工作。

请注意,我将使用新的应用程序作为示例,但我需要使用旧数据库工作的旧应用程序,而不是新的应用程序。

$ rvm use 2.1.5
$ rails _3.2.22_ new r32-mysql2-test -d mysql
$ rails generate model Product name:string description:text
      invoke  active_record
/Users/user/.rvm/gems/ruby-2.1.5@global/gems/bundler-1.7.6/lib/bundler/rubygems_integration.rb:266:in `block in replace_gem': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (can't activate mysql2 (~> 0.3.10), already activated mysql2-0.4.1. Make sure all dependencies are added to Gemfile.) (LoadError)

mysql2 0.4.1无效,请让gem 'mysql2', '~> 0.3.20'添加到Gemfile

$ rails generate model Product name:string description:text
      invoke  active_record
      create    db/migrate/20151117104219_create_products.rb
      create    app/models/product.rb
      invoke    test_unit
      create      test/unit/product_test.rb
      create      test/fixtures/products.yml

$ rake db:create db:migrate
==  CreateProducts: migrating =================================================
-- create_table(:products)
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 `products` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `description` text, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `block in execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activesupport-3.2.22/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/mysql2_adapter.rb:213:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/schema_statements.rb:170:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:434:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:466:in `block in method_missing'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `block in say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:458:in `method_missing'
/Users/user/dev/r32-mysql2-test/db/migrate/20151117104219_create_products.rb:3:in `change'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/connection_pool.rb:129:in `with_connection'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:389:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:528:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `call'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `ddl_transaction'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:719:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `each'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:570:in `up'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:551:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'
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 `products` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `description` text, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `block in execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activesupport-3.2.22/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/mysql2_adapter.rb:213:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/schema_statements.rb:170:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:434:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:466:in `block in method_missing'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `block in say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:458:in `method_missing'
/Users/user/dev/r32-mysql2-test/db/migrate/20151117104219_create_products.rb:3:in `change'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/connection_pool.rb:129:in `with_connection'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:389:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:528:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `call'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `ddl_transaction'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:719:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `each'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:570:in `up'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:551:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'
Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `block in execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activesupport-3.2.22/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/mysql2_adapter.rb:213:in `execute'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/schema_statements.rb:170:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:434:in `create_table'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:466:in `block in method_missing'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `block in say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `say_with_time'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:458:in `method_missing'
/Users/user/dev/r32-mysql2-test/db/migrate/20151117104219_create_products.rb:3:in `change'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:407:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/connection_pool.rb:129:in `with_connection'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:389:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:528:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `call'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:777:in `ddl_transaction'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:719:in `block in migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `each'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:570:in `up'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/migration.rb:551:in `migrate'
/Users/user/.rvm/gems/ruby-2.1.5/gems/activerecord-3.2.22/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
/Users/user/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

在没有切换回MySQL 5.6的情况下,我能做些什么来支持旧数据库吗?

TIA

1 个答案:

答案 0 :(得分:12)

这是两年前为Rails修复的。我不确定哪个版本的Rails有修复。这里有几种不同的方法可以在旧版本的Rails中修复它:https://github.com/rails/rails/pull/13247#issuecomment-158787912

以下是其中一个解决方案:

  

使用Rails 2.3.5,MySQL版本5.7.9和mysql gem,你需要拥有   这个位作为初始化器   配置/初始化/ 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

我想在Rails 2中你应该把它放在environment.rb而不是初始化器中。

对我来说,至少有一个rake任务仍然无法使用该修复程序,我必须在rake任务本身中执行修补程序或需要修补程序。不依赖于环境的I read that rake任务不会加载初始化程序或environment.rb,所以也许这就是原因。也许这仅仅是针对这个代码库...

希望其中一个解决方案有效,但如果没有,那么另一个可能的临时解决方法是修补ActiveRecord以修复该常量(在lib/active_record/connection_adapters/abstract_mysql_adapter.rb中)。

如果您使用activerecord-mysql2-adapter gem,那么您可能还需要修复它。 (查看activerecord-mysql2-adapter-{GEM VERSION}/lib/active_record/connection_adapters/mysql2_adapter.rb)。虽然,我对这个宝石有其他问题,甚至可能都不需要它。