web-dev-qa-db-ja.com

Rails mysqlでrake db:migrateコマンドを使用してテーブルを作成する際の主キーの問題

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び申し上げますが、非常に長い禁欲期間を経てコーディングに戻り、問題を回避することはできません。事前に感謝します:)

23
Aerosewall1

私も最近同じ問題に直面しました。

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
73
paljoshi

上記のソリューションでは運がありませんでした(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に保存しました

12
Andy Day

私もこの問題を抱えていました(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__)
3
TsaiKoga

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 KEYDEFAULTまたはNULLが必要です。問題を解決しました。新しいRailsバージョンに更新します。

2
H6.

この問題は、JRubyのRailsアプリでアップグレードし、mysql-adapter

Gem activerecord-jdbcmysql-adapter v1.3.14を使用し、v1.3.21にアップグレードしました

ソリューションにパッチを適用する前に、jdbcアダプタのバージョンを確認してください。

0
Mateus Q.