2015-11-17 17 views
7

Ho problemi dopo l'aggiornamento a MySQL 5.7.9 (installato tramite brew su OSX 10.11 El Capitan): tutte le mie app legacy basate su Rails 3.2. * Hanno smesso di funzionare .MySQL 5.7.9, Rails 3.2, mysql2 0.3.20

Nota che userò una nuova applicazione come esempio, ma ho bisogno di vecchie applicazioni con database vecchi funzionanti, non nuovi.

$ 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/[email protected]/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 non funziona, quindi aggiungiamo gem 'mysql2', '~> 0.3.20' per 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) 

C'è qualcosa che posso fare per supportare i database legacy senza passare avanti e indietro a MySQL 5.6?

TIA

risposta

12

Questa è stata fissata per Rails due anni fa. Non sono sicuro di quali versioni di Rails hanno la soluzione. Ci sono diversi modi per risolvere il problema nelle versioni precedenti di Rails qui: https://github.com/rails/rails/pull/13247#issuecomment-158787912

Ecco una di quelle soluzioni:

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 

Credo che in Rails 2 si dovrebbe mettere che in environment.rb invece di un inizializzatore.

Per me, almeno un task rake non riesce ancora con quella correzione e ho dovuto eseguire la patch o richiedere la patch direttamente nel task rake stesso. I read that le attività di rake che non dipendono dall'ambiente non caricano gli inizializzatori o environment.rb, quindi forse è per questo. Forse questo è solo specifico per questo codice base ...

Speriamo che una di queste soluzioni funzioni, ma se non è possibile un'altra soluzione temporanea possibile è la patch di scimmia ActiveRecord per correggere quella costante (in lib/active_record/connection_adapters/abstract_mysql_adapter.rb).

Se si utilizza l'gem di activerecord-mysql2-adapter, potrebbe essere necessario correggerlo. (Guarda su activerecord-mysql2-adapter-{GEM VERSION}/lib/active_record/connection_adapters/mysql2_adapter.rb). Sebbene, sto avendo altri problemi con quella gemma, e potrebbe non essere nemmeno necessario.

+0

Grazie! Con l'inizializzatore mysql2 sono riuscito a eseguire le migrazioni. Sfortunatamente la maggior parte delle specifiche fallisce, ad esempio ActiveRecord :: StatementInvalid: Mysql2 :: Errore: l'espressione n. 1 della clausola ORDER BY non è nell'elenco SELECT, la colonna dei riferimenti 'db_test.page_ts.slug' che non è nell'elenco SELECT; questo non è compatibile con DISTINCT: SELECT DISTINCT 'pages'.id DA' pages' LEFT OUTER JOIN 'page_ts' ON' page_ts' .page_id' = 'pages'.'id' WHERE' page_ts' .locale' = 'it 'AND ('page_ts' .slug' =' t-3 'OR' page_ts' .slug' LIKE' t-3 -% ') ORDINA PER LUNGHEZZA ('page_ts' .slug') DESC,' page_ts '.'slug' DESC LIMIT 1''' – tagliala

+0

@david qualsiasi altra soluzione in modo che non abbiamo bisogno di aggiungere questo file? –

+0

Questo è tutto ciò che so. Se stai bene con MySQL 5.6, allora questa è un'opzione, ma potrebbe non essere una soluzione a lungo termine. Non ho incluso questo nella risposta perché la domanda specifica in particolare come eseguire l'upgrade alla 5.7. –

Problemi correlati