Railsは4.0.0、mysqlのバージョンはVer 14.14 Distrib 5.7.9、Win64(x86_64)です。古いバージョンのRails以前の質問 ここ でmysqlと衝突していましたので( Kalelc 私の頼りの答えを確認してください)
走ると
rake db:migrate
次のエラーが表示されます
== 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)
コードでNULLに値を設定していません。ここにコードがあります
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
このコードは、次のチュートリアルに示すようにexactlyです。また、スタックオーバーフローに関する他の ここでも同様の問題 を調査し、与えられたアドバイスに従いました。 提案された猿パッチ を試しました
# lib/patches/abastract_mysql_adapter.rb
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
このファイルを、simple_cmsアプリケーションのlib内のpatchという名前で作成したフォルダーに挿入しました。同じモンキーパッチで提案されているように、ファイルを「abstract_mysql_adapter.rb」として保存しました。 simple_cmsアプリケーションのenvironment.rbを次のように更新しました
require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__)
その後、rake db:migrateコマンドを実行すると
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/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rbは、間違いなく猿パッチへのパスです。パッチを間違った場所に置きましたか?ここで何が間違っているのですか?これが一部の人に明らかな場合はおologiesび申し上げますが、非常に長い禁欲期間を経てコーディングに戻り、問題を回避することはできません。事前に感謝します:)
私も最近同じ問題に直面しました。
MySQL 5.7は、主キーのnullデフォルト値をサポートしなくなりました。
MySqlのプライマリキーのネイティブデフォルトを上書きすることにより、問題を解決できます。
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
上記のソリューションでは運がありませんでした(My env:Rails 3.0.20、MySQL 5.7.13、Ruby 1.9.3p551)。 ActiveRecord::ConnectionAdapters::ColumnDefinition
クラスを上書きすることにより、それを回避します。以下を参照してください。
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
これをconfig/initializers/column_definition.rbに保存しました
私もこの問題を抱えていました(mysql 5.7.17およびRails 4.0.0)。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
そして、私のeverionment.rb
ファイルで:
require File.expand_path('../initializers/mysql2_adapter', __FILE__)
MySQL 5.7.3以降 NULLとして宣言された主キーはエラーを生成します。
PRIMARY KEYの列はNOT NULLでなければなりませんが、明示的にNULLとして宣言された場合、エラーは発生しませんでした。これでエラーが発生します。たとえば、CREATE TABLE t(i INT NULL PRIMARY KEY)などのステートメントは拒否されます。同様のALTER TABLEステートメントでも同じことが起こります。 (バグ#13995622、バグ#66987、バグ#15967545、バグ#16545198)
しかし、あなたのRailsバージョンのcreate_table
は、PRIMARY KEY
にDEFAULT
またはNULL
が必要です。問題を解決しました。新しいRailsバージョンに更新します。
この問題は、JRubyのRailsアプリでアップグレードし、mysql-adapter
。
Gem activerecord-jdbcmysql-adapter v1.3.14を使用し、v1.3.21にアップグレードしました
ソリューションにパッチを適用する前に、jdbcアダプタのバージョンを確認してください。