2015-11-16 35 views
20

La mia versione di rails è 4.0.0, la mia versione di mysql è Ver 14.14 Distrib 5.7.9, per Win64 (x86_64). Sto operando di una versione precedente di binari mentre mi scontravo con il mysql come da mia precedente domanda Here. (Controllare Kalelc 's risposta approvato per il mio ricorso)Problema PRIMARY KEY con la creazione di tabelle in Rails usando rake db: migrate il comando con mysql

su esecuzione

rake db:migrate 

ottengo il seguente errore

== CreateUsers: migrating ==================================================== 
-- create_table(:users) 
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 `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDBC:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' 
C:in `migrate' 
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 `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' 
C:in `migrate' 
Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead 
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' 
C:in `migrate' 
Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

non imposto alcun valore NULL nel mio codice, qui è il codice

Class CreateUsers < ActiveRecord::Migration 

    def up 
    create_table :users do |t| 
     t.column "first_name", :string, :limit => 25 
     t.string "last_name", :limit => 50 
     t.string "email", :default => "", :null => false 
     t.string "password", :limit => 40 
     t.timestamps 
    end 
    end 

    def down 
    drop_table :users 
    end 
end 

Questo codice è esattamente come mostrato nei tutorial che sto seguendo. Ho anche studiato altri similar issues here su overflow dello stack e ho seguito il consiglio dato. Ho provato il monkey patch as suggested

# lib/patches/abastract_mysql_adapter.rb 
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter 
    NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" 
end 

ho inserito il file in una cartella che ho creato chiamato patch all'interno del lib della mia applicazione simple_cms. Ho salvato il file come "abstract_mysql_adapter.rb" come suggerito nella stessa patch di scimmia. Ho aggiornato il mio environment.rb dell'applicazione simple_cms con il seguente

require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__) 

se poi corro un db rake: migrate comando

rake aborted! 
LoadError: cannot load such file -- C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb 
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/config/environment.rb:3:in `<top (required)>' 
Tasks: TOP => db:migrate => environment 
(See full trace by running task with --trace) 

C:/Users/Lizanne/Documents/Codice/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb è sicuramente il percorso verso la patch della scimmia. Ho messo la patch nel posto sbagliato? Cosa sto sbagliando qui, grattandomi sopra questa? Mi scuso se questo è ovvio per alcuni, ma sto tornando alla codifica dopo un'astinenza molto lunga e non riesco a capire la questione. Molte grazie in anticipo per l'aiuto :)

+0

provare a modificare la tua scimmia-patch per ' "int (11) auto_increment chiave primaria non NULL"' – Undo

+0

Hey Annulla grazie per la risposta rapida, l'ho appena provato e ho ancora lo stesso errore di caricamento – Aerosewall1

+0

questa patch per scimmie deve essere salvata nella lib dell'applicazione o nella lib di rails – Aerosewall1

risposta

2

Since MySQL 5.7.3 una chiave primaria dichiarata come NULL genera un errore:

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)

Ma la create_table nella versione Rails vuole ancora un DEFAULT o NULL per il PRIMARY KEY. Ho risolto il problema aggiornando a una versione più recente di rails.

+0

Grazie molto alto 6. :) In realtà ho ripristinato una copia più vecchia di binari dovuta ad alcuni scontri con railties, rail e mysql. Vedrò se riesco a trovare una versione in cui non ottengo questo scontro come descritto qui [http://stackoverflow.com/questions/31766656/nameerror-on-executing-rails-s] – Aerosewall1

+0

Posso chiedere quale versione di rotaie sono stai usando? In modo che io possa aggiornare a quella versione. grazie – Aerosewall1

64

Anch'io ho dovuto affrontare lo stesso problema.

MySQL 5.7 non supporta più valori di default null per la chiave primaria.

Sovrascrivendo l'impostazione predefinita nativa per le chiavi primarie in MySql è possibile risolvere il problema.

in config/inizializzatori/abstract_mysql_adapter.rb:

class ActiveRecord::ConnectionAdapters::MysqlAdapter 
    NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" 
end 

Per mysql2 dovrebbe essere config/inizializzatori/abstract_mysql2_adapter.RB:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
    NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" 
end 
+1

La tua risposta è stata contrassegnata come possibilmente di bassa qualità. Sembra che tu abbia una risposta qui, ma deve essere scritta molto più chiaramente e formattata correttamente. Per favore prova a migliorarlo. –

+0

Grazie, ha senso, a) Non ho individuato il tipo sull'indirizzo, un buon sforzo per individuarlo, e sto anche usando mysql2 quindi suppongo che lib/patches/abastract_mysql_adapter.rb call non funzioni. non ci ho nemmeno pensato.grazie mille :) – Aerosewall1

+5

Questa è la risposta giusta. Non vedere come è bassa qualità. – Subimage

8

Non ha avuto fortuna con le soluzioni di cui sopra (I miei env: Rails 3.0.20, MySQL 5.7.13, Rubino 1.9.3p551). È stato possibile aggirarlo sovrascrivendo la classe ActiveRecord::ConnectionAdapters::ColumnDefinition. Vedi sotto:

class ActiveRecord::ConnectionAdapters::ColumnDefinition 
    def sql_type 
    type.to_sym == :primary_key ? 'int(11) auto_increment PRIMARY KEY' : base.type_to_sql(type.to_sym, limit, precision, scale) rescue type 
    end 
end 

memorizzati questo in config/inizializzatori/column_definition.rb

+1

Questa soluzione ha funzionato per me. Le altre soluzioni funzionavano bene per me su 'schema: load', ma se eseguivo' rails generate migration 'mi è stato presentato un errore costante non inizializzato per NATIVE_DATABASE_TYPES. La tua soluzione ha funzionato senza problemi. Grazie. – brightball

0

ho risolto questo problema con un'applicazione Rails su JRuby su cui sto lavorando aggiornando il mysql-adapter.

stavo usando la gemma activerecord-jdbcmysql adattatore v1.3.14 e aggiornato a v1.3.21

controllare la versione dell'adattatore JDBC prima scimmia patching una soluzione.

2

Ho avuto questo problema (mysql 5.7.17 e Rails 4.0.0). ho riparato con l'aggiunta di un file config/initializers/mysql2_adapter.rb

require 'active_record/connection_adapters/mysql2_adapter' 
class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
    NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" 
end 

e poi, nel mio everionment.rb di file:

require File.expand_path('../initializers/mysql2_adapter', __FILE__)