- 投稿日:2020-08-24T23:29:54+09:00
operator does not exist: timestamp without time zone ~~ unknownというエラーの対処
環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイあらすじ
railsでWebアプリを作成しherokuへデプロイするときにエラーが発生した。
heroku log でエラーを確認すると以下のような表示を発見
operator does not exist: timestamp without time zone ~~ unknownエラー文は初めはよくわからなかったがtimestampとはカラムの型なので型のところで何かエラーが起こっていることがわかりさらに調べて見ました。
そうするとDBの検索の条件文に問題点があることが判明。
もうすこし詳しくいうと、データの作成日時で検索をかけていたロジックが以下みたいに文字列(string型)で検索していたため問題が発生。where('created_at: LIKE(?)', "%%-%%-%%") #左記は問題のコード原因
原因は端的にいえばherokuのDBは『PostgreSQL』であり自分の環境(MySQL)と異なっていたことです。
『MySQL』ではtimestamp型のカラムをstring型で検索しても自動で変換してくれる(寛容)みたいです。
『PostgreSQL』ではSQL文を厳密にしないと動作しないみたいです。(厳しい・・・)対策
xxx.in_time_zone.というメソッドを使うことで解決しました!
例えば自分の場合は月単位でデータを取りたくて2020年8月のデータを取得したい場合(以下)search_time = "2020-08-01" (モデル名).where(created_at: search_time.in_time_zone.all_month)とすることでうまくtimestamp型でデータ検索ができるので『PostgreSQL』でもうまく動きました!
また記述も少なくなりスッキリしました!
最後のall_monthをall_dayなどに変更可能でかなり使えます!詳しくはリンクがあるのでそちらがとてもわかりやすく書いてあります!参照
エラー文について
・https://nobuneko.com/blog/archives/2010/05/postgresql83operator_does_not.html
TimeクラスとDateTimeクラスについて
・https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
- 投稿日:2020-08-24T17:54:53+09:00
データベース(MySQL)の主キーを任意のカラムに変更する。
初めに…
データベースでテーブルを作成すると必ず作成される主キー(
:id
カラム)ですが、デフォルトではレコードに登録された順番に1番から登録されていきます。ところが、既存のサービスを見てみるとhttps://www.uniqlo.com/jp/ja/products/E428313-000
のように商品番号が URL に入っていたり、ユーザー情報を閲覧できるページではユーザー名がパラメータとなっていたりします。
そこで、本投稿ではデータベース(MySQL)で主キーを任意のカラムに変更する方法をご紹介します。データベース (MySQL) の主キーを任意のカラムに変更する方法
db/migrate/_マイグレーションファイル.rbclass ● ● ● < ActiveRecord::Migration[5.2] def change create_table :テーブル名, id: false, primary_key: :主キーにするカラム名 do |t| # `id: false` は、このテーブルでは `:id` カラムを作成しない。という記述です。 # `primary_key:` に主キーにするカラム名を指定する。 t.timestamps end end endapp/models/モデル名.rbclass モデル名 < ApplicationRecord self.primary_key = "主キーにするカラム名" # モデルファイルに この記述をすることで主キー(プライマリーキー)となるカラムを指定する。 end
- モデルファイルに主キーとなるカラムを記述しておくことで、コントローラーから
モデル名.find(params[:id])
により:id
のレコードを呼び出すと…サーバーログParameters: {"id"=>"値"} SELECT `テーブル名`.* FROM `テーブル名` WHERE `テーブル名`.`主キーとするカラム名` = 値 LIMIT 1`となり、ちゃんと主キーとした値が読み込まれてることが分かります。
- 投稿日:2020-08-24T15:43:27+09:00
[Rails]rails db:migrateを実行した際に発生したエラー
状況説明
ターミナル.$ rails db:migrate上記のコードを実行した際に下記エラーが発生。
ターミナル.== 20200823050614 DeviseCreateUsers: migrating ================================ -- create_table(:users) rails aborted! StandardError: An error has occurred, all later migrations canceled: Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `nickname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT '' NOT NULL, `pass` varchar(255) NOT NULL, `confirmation_pass` varchar(255) DEFAULT '' NOT NULL, `family_name` varchar(255) NOT NULL, `family_name_kana` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, `first_name_kana` varchar(255) NOT NULL, `birth_year` int NOT NULL, `birth_month` int NOT NULL, `birth_day` int NOT NULL, `icon` varchar(255), `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) /Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change' /Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>' /Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: ActiveRecord::StatementInvalid: Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `nickname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT '' NOT NULL, `pass` varchar(255) NOT NULL, `confirmation_pass` varchar(255) DEFAULT '' NOT NULL, `family_name` varchar(255) NOT NULL, `family_name_kana` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, `first_name_kana` varchar(255) NOT NULL, `birth_year` int NOT NULL, `birth_month` int NOT NULL, `birth_day` int NOT NULL, `icon` varchar(255), `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) /Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change' /Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>' /Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: Mysql2::Error: Table 'users' already exists /Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change' /Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>' /Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)エラー内容
Table 'users' already exists: CREATE TABLE
users``の箇所を翻訳すると、usersテーブルは既に存在しますと言った内容。作成した覚えはないが、存在していると言うことなので下記コードで一度確認。
ターミナル.$ rails db:migrate:statusすると以下のように...
ターミナル.database: furima_app_development Status Migration ID Migration Name -------------------------------------------------- up 000 ********** NO FILE ********** down 20200823050614 Devise create usersどうやら
up 000 ********** NO FILE **********
が悪さをしていたようですね。エラー原因
マイグレーションファイルをコマンドで削除せずに、手動で削除したことが原因のようで、マイグレーションファイルの操作は必ずコマンドで行わなければならないと言うことでした...。(初歩的だけど一度はやってしまいがち?)
エラー対処法
ステータスがupとなっているところをdownにしなければいけないので、そのためのマイグレーションファイルをdb/migrate配下に作成。
NO FILEとなっているマイグレーションIDのファイルが必要なので、
000_dummy.rb
とし、以下のようにコード記述。db/migrate/000_dummy.rbclass Dummy < ActiveRecord::Migration[5.2] def change end endこの状態でもう一度、
rails db:migrate:status
を実行すると、以下のように作成したマイグレーションファイルが確認できる。ターミナル.database: furima_app_development Status Migration ID Migration Name -------------------------------------------------- up 000 Dummy down 20200823050614 Devise create users続いて、次のコマンドでdownにします。(マイグレーションIDはご自身のものを指定)
ターミナル.$ rails db:migrate:down VERSION=000再び
rails db:migrate:status
を実行すると、downに変更されているはずですので、後はDummyファイル
を削除すれば解決!改めて
rails db:migrate
を実行すればテーブルを作成できると思います。最後に
今回の発信で50記事達成!
この調子で継続していきますので今後も宜しくお願いします。
- 投稿日:2020-08-24T13:13:30+09:00
MySQL5.6から5.7にアップグレードする手順
はじめに
初心者の備忘として。
Laravel×MySQLで学習を進めていると、結構最初の段階でエラーが出て進めなくなった。調べてみたところMySQLのアップグレードで解消できる模様。アップグレードがてら、今後の参考にしようということでまとめてみます。■参考になる(かもしれない)人
・MySQL5.6から5.7にアップグレードしたい人
・ドットインストールのローカル開発環境の構築 [macOS版]のレッスンでMySQLをインストールした人(MySQLを、MacでYumリポジトリを使ってインストールした人)【困った① いろいろなやり方があったけど…】
アップグレードについて調べていると、いろいろな方法が。この記事(Qiita)とかこの記事(企業発信)はサーバーの停止とかMySQLの削除とかしているからそれは必須?違う箇所があるけどどっちが正しい?どれをやっても同じ?
調べても調べてもわからないので、初めてMySQLの公式ドキュメントをみてみることに。
アップグレード手順は、プラットフォームと初期インストールの実行方法によって異なります。現在のMySQLインストールに適用される手順を使用します。
- Windows以外のプラットフォームでのバイナリおよびパッケージベースのインストール…
- MySQL Yumリポジトリを使用したEnterprise LinuxプラットフォームまたはFedoraへのインストール…
- MySQL APTリポジトリを使用したUbuntuへのインストール…
- MySQL SLESリポジトリを使用したSLESへのインストール…
- Dockerを使用して実行されるインストール…
- Windowsでのインストール…
・・・なるほど。初期インストールの実行方法によってアップグレードの方法は異なるのか。しかも現在インストールされているバージョンによっても変わってくる模様。だからいろいろな方法が紹介されているのか!
ここで新たな問題が。【困った② どうやってMySQLをインストールしたのか覚えていない…】
初期インストールの実行方法によってアップグレードする方法が違うのはわかったけど…どうやってインストールしたっけ?
ドットインストールの「ローカル開発環境の構築 [macOS版]」を進めていたら、いつの間にかPHPとかMySQLが使えるようになっていたな(確か)、と思い出しもう一度動画をおさらい。
仮想マシンの設定をしよう(#7)でgitをインストールし、gitを使ってアプリケーション設定用のスクリプトをDL・実行していた。その中でphpやMySQLが、yum を使ってインストールされていた。つまりMacユーザでドットインストールでローカル開発環境を整えた場合、MySQL Yumリポジトリを使用している模様。
同じ状況の人がいれば(いるのかな?)、これ以降の記事が参考になると思います(多分)。【環境】
・Mac
・CentOS 6.8
・ローカル開発環境(Vagrant,virtualbox)【困った③ じゃあどうやればいいの?】
MySQL Yumリポジトリを使用したMySQLのアップグレードをとりあえず読んでみた。箇条書きにしてみます。
- デフォで、自動で現在のリリースシリーズの最新バージョンにしてくれる(例えば、5.6.xの「.x」シリーズは自動的に更新される。5.7には更新されない。)
- 5.6から5.7に更新するには、5.6のサブリポジトリを無効にし、5.7のサブリポジトリを有効にする必要がある。
- 上の設定をした後、MySQLのアップグレードを行う
なるほど。なんとなくわかった(気がする)。
STEP 0. yumのユーティリティツールをインストール(必要?)
後でインストールするMySQLのバージョンを5.7にするために5.6を無効化したりするのに利用するらしいから、上記で触れたドキュメントには記載がなかったけど実行してみた。「インストールしています」とかいろいろ表示されたから、必要だったのかな??(誰か教えてください)
【余談】そもそもyumって何??[vagrant@localhost ~]$ sudo yum -y install yum-utilsSTEP 1. サブリポジトリの有効/無効の確認
MySQL Yumリポジトリ内のサブリポジトリを下記のコマンドで全て表示し、それぞれの有効・無効の確認をする。
ふむふむ、mysql56-community
は有効で、mysql57-community-・・・
は無効になっている(だからバージョンが5.6なのかな?)。[vagrant@localhost ~]$ yum repolist all | grep mysql mysql-connectors-community MySQL Connectors Community 有効: 137 mysql-connectors-community-source MySQL Connectors Community - Sour 無効 mysql-tools-community MySQL Tools Community 有効: 93 mysql-tools-community-source MySQL Tools Community - Source 無効 mysql55-community MySQL 5.5 Community Server 無効 mysql55-community-source MySQL 5.5 Community Server - Sour 無効 mysql56-community MySQL 5.6 Community Server 有効: 606 mysql56-community-source MySQL 5.6 Community Server - Sour 無効 mysql57-community-dmr MySQL 5.7 Community Server Develo 無効 mysql57-community-dmr-source MySQL 5.7 Community Server Develo 無効STEP 2. サブリポジトリの5.6の無効化・5.7の有効化
MySQL 5.6シリーズのサブリポジトリを無効にして、MySQL 5.7シリーズのサブリポジトリを有効にする(ドキュメントの説明はちょっとややこしかった)。
[vagrant@localhost ~]$ sudo yum-config-manager --disable mysql56-community [vagrant@localhost ~]$ sudo yum-config-manager --enable mysql57-community-dmrちなみに、
sudo yum-config-manager --enable mysql57-community
と実行しても、
読み込んだプラグイン:fastestmirror
とだけ表示されて有効に変わらなかったので、他の記事も参考に-dmr
をつけて実行したところ、ちゃんと有効に変わった。STEP 3. MySQLのアップグレード
[vagrant@localhost ~]$ sudo yum update mysql-server //dnfが有効でない場合※dnf有効の場合、
sudo dnf upgrade mysql-server
【余談】・・・dnfって何??STEP 4. 確認
ちゃんとMySQL5.7になっているか確認。
[vagrant@localhost ~]$ mysql --version mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper参考
・Windows以外のプラットフォームでのバイナリおよびパッケージベースのインストールについて
・MySQL Yumリポジトリを使用したEnterprise LinuxプラットフォームまたはFedoraへのインストールについて
・MySQL APTリポジトリを使用したUbuntuへのインストールについて
・MySQL SLESリポジトリを使用したSLESへのインストールについて
・Dockerを使用して実行されるインストール
・Windowsでのインストールについて【余談】
■そもそもyumって何??
- yumは、Red Hat系のLinuxディストリビューションで使われている“RPMパッケージ”を扱うためのパッケージ管理コマンド。
- yumコマンドの書式:
yum [オプション] コマンド [パッケージ名など]
(例)yum install[update/erase] パッケージ名■・・・dnfって何??
DNFまたはDandified Yum (ダンディファイド ヤム)は、RPMベースのパッケージ管理システムを採用しているLinuxディストリビューション用のパッケージマネージャであるYum 3.4のフォークであり、Yumの事実上の後継バージョン
- 投稿日:2020-08-24T11:02:34+09:00
PHP掲示板に検索機能の実装
PHPで作成した掲示板に、検索機能を実装したので振り返りつつ。
参考にした記事はこちら。
https://www.sejuku.net/blog/104455具体的な機能は、
名前を検索すると、それに紐づいたIDと発言内容を表示する
という形。トップページに検索内容の入力フォーム→別ファイル検索機能(search.php)の作成
で行った。検索内容の入力フォームの作成
TOPページにこんな感じで作成した。
実際に機能が動くのはsearch.php。
ここでは入力フォームで文字を受け取り、"search_name"という名前で受け取る。index.php<h2>検索</h2> <form action="search.php" method="post"> <!-- 任意の<input>要素=入力欄などを用意する --> <input type="text" name="search_name"> <!-- 送信ボタンを用意する --> <input type="submit" name="submit" value="名前を検索する"> </form>検索機能の作成
検索機能に関して、DB接続の前半部と、検索されてきた文字を表示する後半部に分けて説明。
DBから任意のデータを検索する前半部。
search.php<?php try{ //DBに接続 $dsn = 'mysql:dbname=test_bbs2; host=localhost'; $username= 'root'; $password= 'root'; $pdo = new PDO($dsn, $username, $password); //SQL文を実行して、結果を$stmtに代入する。 $stmt = $pdo->prepare(" SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%' "); //実行する $stmt->execute(); echo "OK"; echo "<br>"; } catch(PDOException $e){ echo "失敗:" . $e->getMessage() . "\n"; exit(); } ?>DB接続に関しては割愛。
大事なのはsearch.php$stmt = $pdo->prepare(" SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%' ");ここの部分。
" SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%' "ここのSQL文で
・contactsテーブルから(FROM contacts)
・submit_nameの条件で(WHERE submit_name)
・$_POST["search_name"]を含む値を取得する$_POST["search_name"]の前後の%や、LIKEがないと、
田中という名前があった時に、「田」一文字では田中をヒットできない。
「田中」という全部一致しないと検索されてこない、という状況が起こる。%(ワイルドカード)の使い方の詳細については
https://qiita.com/ika_katsuo/items/40e7784284344c7d8697
こちらの記事を参考に。LIKEによる検索はあいまい検索という。
DBから取得したデータを画面に表示する後半部。
DBから取り出したデータを、HTMLとPHPで記述して画面に表示する。
コードはこんな感じになっている。search.php<html> <body> <table> <tr><th>ID</th><th>Name</th><th>remark</th></tr> <!-- ここでPHPのforeachを使って結果をループさせる --> <?php foreach ($stmt as $row): ?> <tr> <td><?php echo $row[0]?></td> <td><?php echo $row[1]?></td> <td><?php echo $row[2]?></td> </tr> <?php endforeach; ?> </table> </body> </html>ここではhtmlで記述し、foreachでstmtのオブジェクトから値を取り出しています。
・$row[0]でIDを、
・$row[1]で名前を、
・$row[2]で投稿内容を
それぞれ表示します。
あとはテーブルの形になるようにtableタグが使われています。
以上です。
- 投稿日:2020-08-24T09:05:43+09:00
MySQL 認証プラグイン caching_sha2_password
はじめに
MySQLに接続できないエラーでハマったので対処法を備忘録としてまとめました。
エラー内容
認証プラグインがcaching_sha2_passwordとなっていることが原因だそうです。
そこで、まずはMySQLに接続して認証プラグインを確認します。ターミナル$ mysql -u root //mysqlにrootで接続。rootにパスワードを設定している場合はオプションでパスワードを指定する mysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+rootの認証プラグインがcaching_sha2_passwordになっています。
対策(caching_sha2_passwordをmysql_native_passwordに変更)
認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。
下記が変更するためのコマンドです。ターミナルmysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>';User, Host, passwordの部分は置き換えてください。
私の場合はrootを変更したいので下記のようにしました。
ターミナルmysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password';変更できているか確認する
ターミナルmysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | mysql_native_password | <= 変更されている! +------------------+-----------+-----------------------+Dockerの場合
Dockerのコンテナ内で認証プラグインを変更する場合にはまずコンテナに入る必要があります。
ターミナル$ docker ps //DockerのCONTAINER IDを確認 $ docker exec -it <CONTAINER ID> bash //確認したMySQLのCONTAINER IDを指定してコンテナに接続 # mysql -u root -p Enter password: <database.ymlで設定したpassword> mysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>' //rootの認証プラグインを変更変更されているか確認↓
ターミナルmysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | mysql_native_password | <= 変更されている! +------------------+-----------+-----------------------+コンテナを削除して、再度Buildすれば完了です。
ターミナル$ docker-compose down $ docker-compose build終わりに
RailsとMySQLを使用しているとたまーにハマって抜け出せなくなるので、私みたいに時間を無駄にしてほしくないという思いも込めてまとめてみました。
みなさんの一助となれば幸いです。
- 投稿日:2020-08-24T09:05:43+09:00
MySQLの認証プラグインを変更する方法(caching_sha2_password)
はじめに
MySQLに接続できないエラーでハマったので対処法を備忘録としてまとめました。
エラー内容
Plugin caching_sha2_password could not be loaded: /usr//usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory認証プラグインがcaching_sha2_passwordとなっていることが原因だそうです。
そこで、まずはMySQLに接続して認証プラグインを確認します。ターミナル$ mysql -u root //mysqlにrootで接続。rootにパスワードを設定している場合はオプションでパスワードを指定する mysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+rootの認証プラグインがcaching_sha2_passwordになっています。
対策(caching_sha2_passwordをmysql_native_passwordに変更)
認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。
下記が変更するためのコマンドです。ターミナルmysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>';User, Host, passwordの部分は置き換えてください。
私の場合はrootを変更したいので下記のようにしました。
ターミナルmysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password';変更できているか確認する
ターミナルmysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | mysql_native_password | <= 変更されている! +------------------+-----------+-----------------------+Dockerの場合
Dockerのコンテナ内で認証プラグインを変更する場合にはまずコンテナに入る必要があります。
ターミナル$ docker ps //DockerのCONTAINER IDを確認 $ docker exec -it <CONTAINER ID> bash //確認したMySQLのCONTAINER IDを指定してコンテナに接続 # mysql -u root -p Enter password: <database.ymlで設定したpassword> mysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>' //rootの認証プラグインを変更変更されているか確認↓
ターミナルmysql> SELECT User, Host, Plugin FROM mysql.user; //User, Host, Pluginを確認 +------------------+-----------+-----------------------+ | User | Host | Plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | mysql_native_password | <= 変更されている! +------------------+-----------+-----------------------+コンテナを削除して、再度Buildすれば完了です。
ターミナル$ docker-compose down $ docker-compose build終わりに
RailsとMySQLを使用しているとたまーにハマって抜け出せなくなるので、私みたいに時間を無駄にしてほしくないという思いも込めてまとめてみました。
みなさんの一助となれば幸いです。