質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3049閲覧

rails db:migrate をすると NoMethodError: undefined method `<<' for nil:NilClass エラー発生してしまう

kiyomasa

総合スコア40

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1グッド

2クリップ

投稿2021/04/21 01:52

編集2021/04/22 12:58

#rails でdb:migrateでマイグレードファイルを反映させたい

rails でアプリを作成中です。
Userテーブルを作成する段階で、
rails generate model User name:string email:string
後にrails db:maigrateをするとエラーが出てしまう

エラー内容

NoMethodError: undefined method `<<' for nil:NilClass /ローカル/environment/cooklog/bin/rails:5:in `<top (required)>' /ローカル/environment/cooklog/bin/spring:15:in `<top (required)>' Tasks: TOP => db:migrate (See full trace by running task with --trace)

タイムスタンプ_create_users.rb

class CreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| t.string :name t.string :email t.string :password_digest t.timestamps end end end

追加

database.yml

1 2development: 3 adapter: mysql2 4 encoding: utf8 5 reconnect: false 6 database: cooklog_development 7 pool: 5 8 username: kiyomasa 9 password: 51830890 10 host: localhost 11 12test: 13 adapter: mysql2 14 encoding: utf8 15 reconnect: false 16 database: cooklog_test 17 pool: 5 18 username: kiyomasa 19 password: 51830890 20 host: localhost 21

##試したこと
https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288
URLを参考に、database.ymlを変更したり、
db:reset
を行って初期化などはしましたが、何も変わりませんでした。

エラー内容の<<という文字列を検索してもコメント部分でしか一致せず、メソッド自体どこにあるかも不明でした。

どなたかわかる方がいたら、教えてください。。。
読んでいただきありがとうございます。

##環境
mac
Rails 6.1.3.1
ruby 3.0.
mysql Ver 8.0.23 for osx10.15 on x86_64 (Homebrew)

##追記

bin/rails

#!/usr/bin/env ruby load File.expand_path("spring", __dir__) APP_PATH = File.expand_path('../config/application', __dir__) require_relative "../config/boot" require "rails/commands"

bin/spring

unless defined?(Spring) require 'rubygems' require 'bundler' lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) spring = lockfile.specs.detect { |spec| spec.name == 'spring' } if spring Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path gem 'spring', spring.version require 'spring/binstub' end end
bundle exec rails db:migrate --trace

の実行結果も同様のエラーが発生しました。(全文追加)

kiyomasa@inouekiyomasanoMacBook-Air cooklog % bundle exec rails db:migrate --trace ** Invoke db:migrate (first_time) ** Invoke db:load_config (first_time) ** Invoke environment (first_time) ** Execute environment ** Execute db:load_config ** Execute db:migrate rails aborted! NoMethodError: undefined method `<<' for nil:NilClass /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:1240:in `type_to_sql' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/mysql/schema_statements.rb:117:in `type_to_sql' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:16:in `type_to_sql' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:32:in `visit_ColumnDefinition' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:13:in `accept' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:47:in `block in visit_TableDefinition' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:47:in `map' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:47:in `visit_TableDefinition' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:13:in `accept' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:322:in `create_table' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/mysql/schema_statements.rb:81:in `create_table' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/schema_migration.rb:27:in `create_table' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/migration.rb:1228:in `initialize' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/migration.rb:1086:in `new' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/migration.rb:1086:in `up' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/migration.rb:1061:in `migrate' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/tasks/database_tasks.rb:237:in `migrate' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/railties/databases.rake:92:in `block (3 levels) in <main>' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/railties/databases.rake:90:in `each' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/railties/databases.rake:90:in `block (2 levels) in <main>' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/rake-13.0.3/lib/rake/task.rb:281:in `block in execute' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/rake-13.0.3/lib/rake/task.rb:281:in `each' 長すぎて質問できなくなってしまうので、省略 /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/railties-6.1.3.1/lib/rails/commands.rb:18:in `<main>' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require' /Users/kiyomasa/environment/cooklog/bin/rails:5:in `<top (required)>' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `load' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `call' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/client.rb:30:in `run' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/bin/spring:49:in `<top (required)>' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `load' /Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `<top (required)>' /Users/kiyomasa/environment/cooklog/bin/spring:15:in `require' /Users/kiyomasa/environment/cooklog/bin/spring:15:in `<top (required)>' bin/rails:2:in `load' bin/rails:2:in `<main>' Tasks: TOP => db:migrate
shinoharat2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat2

2021/04/21 13:51

【1】 bin/rails と bin/spring の中身を質問文に追加してください。 【2】 コマンドの最後に「--trace」を付けて、 bundle exec rails db:migrate --trace とすると、どのように表示されますか?
kiyomasa

2021/04/21 22:20 編集

ありがとうございます。 【1】追加させていただきました 【2】同様のエラーが発生し ``` bin/rails:2:in `load' bin/rails:2:in `<main>' Tasks: TOP => db:migrate ``` となりました
shinoharat2

2021/04/21 23:44

追記ありがとうございます。 以下のように出力されているので gem の内部でエラーになってるみたいですね。 active_record/connection_adapters/abstract/schema_statements.rb:1240:in `type_to_sql' その辺の実装を追ってみると何か分かるかもしれません。 私の方でも見てみます。
shinoharat2

2021/04/21 23:55

ちなみに、エラー出力は質問文に貼ってあるもので全てですか? 長かったので一部省略した、とかないですか?
scivola

2021/04/22 03:42

config/database.yml を省略せずに全部張っていただけますか?
kiyomasa

2021/04/22 13:02

ありがとうございます。 エラー内容は全て追加したものの、文字数制限で全ては入りきませんでした。 database.ymlは全文追加しました。
shinoharat2

2021/04/22 15:58 編集

rails console を起動して 【1】 ActiveRecord::Base.connection.native_database_types 【2】 ActiveRecord::Base.connection.native_database_types[:string].dup 【3】 ActiveRecord::Base.connection.native_database_types[:string][:name].dup の結果をそれぞれ教えていただけませんか?
kiyomasa

2021/04/22 22:17 編集

ありがとうございます。 ``` irb(main):001:0> ActiveRecord::Base.connection.native_da tabase_types => {:primary_key=>"bigint auto_increment PRIMARY KEY", :string=>{:email=>"varchar", :limit=>100}, :text=>{:name=>"text"}, :integer=>{:name=>"int", :limit=>4}, :float=>{:name=>"float", :limit=>24}, :decimal=>{:name=>"decimal"}, :datetime=>{:name=>"datetime"}, :timestamp=>{:name=>"timestamp"}, :time=>{:name=>"time"}, :date=>{:name=>"date"}, :binary=>{:name=>"blob"}, :blob=>{:name=>"blob"}, :boolean=>{:name=>"tinyint", :limit=>1}, :json=>{:name=>"json"}} irb(main):002:0> ActiveRecord::Base.connection.native_da tabase_types[:string].dup => {:email=>"varchar", :limit=>100} irb(main):003:0> ActiveRecord::Base.connection.native_da tabase_types[:string][:name].dup => nil ```
guest

回答1

0

ベストアンサー

直接的なエラーの原因

「ActiveRecord::Base.connection.native_database_types」は、マイグレーションで指定したデータ型を、データベースの種類に応じた形式に変換するための Hash です。

例えば、マイグレーションで t.string と書いた場合、データベース側では varchar(255) にする、みたいな感じです。

で、MySQL の場合、本来なら、

native_database_types[:string]

の結果は

{:name=>"varchar", :limit=>255}

になるはずなのですが、質問者さんの環境だと

{:email=>"varchar", :limit=>100}

になっています。

:limit の違いはともかく、 :name が無いのが致命的で、これが NoMethodError に繋がっています。

根本的な原因の調査

では、なぜ native_database_types が書き変わっているのか、という点ですが、実はまだ私にも分かりません。
普通に使っていれば、勝手に書き換わるなんてことは無いはずなのですが・・・

更なる調査のため、以下の確認をお願いします。

【1】初期化コードの確認

以下のコマンドを実行し、どこかで「NATIVE_DATABASE_TYPES」を書き換えていないか確認してください。

grep -i -r NATIVE_DATABASE_TYPES app bin config db lib

もし書き換えているなら、そのコードを削除してください。

--

【2】Rails のソースコードの確認

以下のファイルの31行目辺りを確認してください。

/Users/kiyomasa/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.1/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

以下のように定義されていれば問題ありません。

rb

1 ### OK ### 2 NATIVE_DATABASE_TYPES = { 3 : 4 string: { name: "varchar", limit: 255 }, 5 : 6 }

もし以下のように定義されているなら、gem rails を一旦削除し、再インストールしてください。

rb

1 ### NG ### 2 NATIVE_DATABASE_TYPES = { 3 : 4 string: { email: "varchar", limit: 100 }, 5 : 6 }

とりあえずマイグレーションを動かす方法

上記の調査でも原因が判明せず、
「原因調査は置いといて、とりあえずマイグレーションを動かしたい」
という場合は、 config/initializers 配下に修正パッチを作成してください。

config/initializers/change_mysql_adapter.rb

rb

1# db:migrate で NoMethodError が発生するが、原因不明なので、とりあえず応急処置 2# https://teratail.com/questions/334359 3# 4class ActiveRecord::ConnectionAdapters::MysqlAdapter 5 NATIVE_DATABASE_TYPES[:string] = { name: "varchar", limit: 255 } 6end

根本的な解決ではないので、あまりオススメはできませんが・・・

投稿2021/04/23 04:09

shinoharat

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiyomasa

2021/04/23 06:35

回答ありがとうございます。 結果、 【1】の内容の通り、全て削除したところ無事 マイグレーションできました。 ``` kiyomasa@inouekiyomasanoMacBook-Air cooklog % rails db:migrate == 20210417114041 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0342s == 20210417114041 CreateUsers: migrated (0.0343s) ============================= ``` 【1】については、config/initialize/にmysql.rbを作成し、確かに記載していました。 以前、メアドにプライマリーキーを付けようとしたら、バイトがDBのサイズを超えるというエラーが出てしまい、それの対策として記載していたことを思い出しました。 ``` # Specified key was too long; max key length is 767 byte # への対策。 # require 'active_record/connection_adapters/abstract_mysql_adapter' # module ActiveRecord # module ConnectionAdapters # class AbstractMysqlAdapter # NATIVE_DATABASE_TYPES[:string] = { :email => "varchar", :limit => 100 } # end # end # end ``` 一旦全てコメントアウトしました。 その後、rails cで ``` ActiveRecord::Base.connection.native_da tabase_types[:string].dup => {:name=>"varchar", :limit=>255} ``` 実行したところ、nameが出てくるようになりました。 【2】はファイルが見つかりませんでした、、、 VSコードのターミナルで起動していたから、.rbenvフォルダがあったのでしょうか... 時間をかけて、詳細までかなり詳しく調べていただき、解決方法を教えていただきありがとうございます! プライマリーキーのエラーはまた出たら別の方法でなんとかしたいと思います。 本当にありがとうございます。
shinoharat

2021/04/23 08:42

解決したようで何よりです。 > 以前、メアドにプライマリーキーを付けようとしたら、バイトがDBのサイズを超えるというエラーが出てしまい、それの対策として記載していたことを思い出しました。 なるほどです。 そういう事情があるのであれば、コメントアウトではなく、mysql.rb を以下のように修正して対応した方がいいかもしれません。 ( :email を :name に変えるだけ) NATIVE_DATABASE_TYPES[:string] = { :email => "varchar", :limit => 100 }  ↓ NATIVE_DATABASE_TYPES[:string] = { :name => "varchar", :limit => 100 }
kiyomasa

2021/04/24 09:11

なるほど、やってみます!何から何までありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問