2015-11-16 4 views
20

Meine Version von Rails ist 4.0.0, meine Version von MySQL ist Ver 14.14 Distrib 5.7.9, für Win64 (x86_64). Ich betreibe eine ältere Version von Rails, da ich einige Konflikte mit dem MySQL bekommen habe, wie in meiner vorherigen Frage Here. (Check Kalelc ‚s genehmigt Antwort für meine Zuflucht)PRIMARY KEY Problem beim Erstellen von Tabellen in Rails mit Rake db: migrieren Befehl mit mysql

auf Lauf

rake db:migrate 

bekomme ich folgende Fehler

== 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) 

Ich habe keine Werte auf NULL in meinem Code, hier ist der Code

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 

Dieser Code ist genau wie in den Tutorials gezeigt, die ich folge. Ich habe auch andere similar issues here auf Stack-Überlauf untersucht und den Ratschlag befolgt. Ich habe die 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 

versucht, eingefügt ich diese Datei in einen Ordner I genannt Flecken im lib meiner simple_cms Anwendung erstellt haben. Ich habe die Datei als "abstract_mysql_adapter.rb" gespeichert, wie im gleichen Affen-Patch vorgeschlagen. Ich habe meine environment.rb der simple_cms Anwendung mit dem folgenden

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

aktualisiert, wenn ich dann eine rake db laufen: wandern Befehl

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/Dokumente/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb ist definitiv der Weg zum Affen-Patch. Habe ich den Patch an die falsche Stelle gesetzt? Was mache ich hier falsch und kratze mich am Kopf? Entschuldigung, wenn das für einige offensichtlich ist, aber ich komme nach einer sehr langen Abstinenz wieder zum Coding und ich kann mich nicht mit dem Thema herumschlagen. Vielen Dank im Voraus für Sie :)

+0

Versuchen Sie Ihren Affen-Patch Bearbeitung ' "int (11) auto_increment PRIMARY KEY NOT NULL"' – Undo

+0

Hey Undo Danke für schnelle Antwort, nur versucht, und ich bekomme immer noch die gleichen Load Fehler – Aerosewall1

+0

muss dieser Affe Patch in der Bibliothek der Anwendung oder die Lib von Schienen gespeichert werden – Aerosewall1

Antwort

2

Since MySQL 5.7.3 ein Primärschlüssel deklariert als NULL helfen, einen Fehler erzeugt:

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)

Aber die create_table in Ihrer Rails-Version will noch ein DEFAULT oder NULL für die PRIMARY KEY. Ich habe das Problem gelöst, indem ich auf eine neuere Rails-Version aktualisiert habe.

+0

Danke sehr hoch 6. :) Ich bin tatsächlich auf eine ältere Kopie von Rails zurückgekommen zu einigen Zusammenstößen mit Eisenbahnen, Schienen und mysql. Ich werde sehen, ob ich eine Version finden kann, wo ich diesen Zusammenstoß nicht bekomme, wie hier beschrieben [http://stackoverflow.com/questions/31766656/nameerror-on-executing-rails-s] – Aerosewall1

+0

Darf ich fragen, welche Version von Schienen sind verwendest du? Damit ich auf diese Version updaten kann. danke – Aerosewall1

64

Ich vor kurzem vor demselben Problem.

MySQL 5.7 unterstützt keine Null-Standardwerte für den Primärschlüssel mehr.

Durch Überschreiben der nativen Standardeinstellung für Primärschlüssel in MySql können Sie Ihr Problem beheben.

In config/initializers/abstract_mysql_adapter.rb:

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

Für mysql2 sollte es sein config/initializers/abstract_mysql2_adapter.rb:

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

Ihre Antwort wurde als möglicherweise minderwertig gekennzeichnet. Es sieht so aus, als ob Sie hier eine Antwort haben, aber es muss deutlich klarer geschrieben und korrekt formatiert werden. Bitte versuchen Sie es zu verbessern. –

+0

Vielen Dank, das macht Sinn, a) Ich habe nicht den Typ auf Adresse, gute Bemühungen, das zu erkennen, und ich benutze auch mysql2, so denke ich, lib/patches/abastract_mysql_adapter.rb Anruf würde nicht funktionieren. Daran habe ich gar nicht gedacht.Vielen Dank :) – Aerosewall1

+5

Dies ist die richtige Antwort. Sieh nicht, wie niedrig die Qualität ist. – Subimage

8

Haben Sie nicht haben Glück mit den Lösungen, die oben (My env: Rails 3.0.20, MySQL 5.7.13, Rubin 1.9.3p551). War in der Lage, es durch Überschreiben der ActiveRecord::ConnectionAdapters::ColumnDefinition Klasse zu umgehen. Siehe unten:

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 

Stored dieses in config/initializers/column_definition.rb

+1

Diese Lösung funktionierte für mich. Die anderen Lösungen funktionierten für mich auf "schema: load", aber wenn ich "rails generate migration" lief, wurde mir ein nicht initialisierter konstanter Fehler für NATIVE_DATABASE_TYPES angezeigt. Ihre Lösung hat ohne Probleme funktioniert. Vielen Dank. – brightball

0

Ich löste dieses Problem mit einer Rails-Anwendung auf JRuby Ich arbeite an durch die mysql-adapter aktualisieren.

Ich war mit dem Edelstein-active jdbcmysql-Adapter v1.3.14 und ein Upgrade auf v1.3.21

Prüfen Sie Ihre JDBC-Adapter Version vor Affen, der eine Lösung von Flicken.

2

Ich hatte dieses Problem auch (mysql 5.7.17 und Rails 4.0.0). ich es behoben, indem ein 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 

Hinzufügen und dann, in meiner everionment.rb Datei:

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