- 投稿日:2020-02-24T19:08:32+09:00
【Tips】Rails の Minitest 実行時に想定外のデータベース名になって ConnectionError となる原因と対処法
問題
rails test
実行時にデータベース名末尾に-0
-1
などが付きアクセスが拒否されてしまう。入力
rails test
出力
ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031] test_n【テストの名前】#【テストクラスの名前】 (0.14s) Minitest::UnexpectedError: Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-0' ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031] test_n【テストの名前】#【テストクラスの名前】 (0.21s) Minitest::UnexpectedError: Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-1' ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031] test_n【テストの名前】#【テストクラスの名前】 (0.31s) Minitest::UnexpectedError: Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-2' ...環境
- Windows 10
- Ubuntu 18.04 LTS
- anyenv 1.1.1
- rbenv 1.1.2-20-g143b2c9
- ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
- Rails 6.0.2.1
- MySQL
原因
test/test_helper.rb
でマルチスレッド実行設定が行われているため複数のデータベースにアクセスされてしまう。解決方法
マルチスレッド設定をコメントアウトする。
test/test_helper.rbclass ActiveSupport::TestCase # Run tests in parallel with specified workers # parallelize(workers: :number_of_processors) # ↑をコメントアウト # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Add more helper methods to be used by all tests here... end補足
おそらく
-0
-1
などとついたデータベースを作成することでも解決可能。
- 投稿日:2020-02-24T17:19:49+09:00
MacにDocker+Rails6+MySQLで開発環境構築
公式ドキュメント(https://docs.docker.com/compose/rails/) を以下のコンポーネントでやってみた。
- ruby2.6.5
- Rails6系
- MySQL5.7前提
MacにDocker Desktopがインストールされていること。
適宜、プロジェクト用のディレクトリを用意する。Dockerfile
DockerfileFROM ruby:2.6.5 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]Gemfile
source 'https://rubygems.org' gem 'rails', '~>6'Gilefile.lock
touch Gemfile.lock
entrypoint.sh
entrypoint.sh#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"docker-compose.yml
docker-compose.ymlversion: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - "3306:3306" web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - dbRailsプロジェクトの作成
# 薄いRailsプロジェクト docker-compose run web rails new . --force --database=mysql -B -M -C --skip-coffee --skip-turbolinksbuild
docker-compose builddatabase.ymlの修正
config/database.ymldefault: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password # docker-compose.yml の MYSQL_ROOT_PASSWORD host: dbコンテナ再起動
docker-compose down docker-compose up -dWebpacker
docker-compose run web bundle exec rails webpacker:installDB作成
docker-compose run web bundle exec rails db:create
- 投稿日:2020-02-24T16:11:55+09:00
MySQL Sample DatabaseのデータをローカルのDockerコンテナで立てたMySQLに反映させる方法
ここの「Download MySQL Sample Database」からmysqlsampledatabase.sqlをダウンロードします。
以下のようなテーブルが作成できます
ダウンロードした.sqlファイルをdocker/db/sqlにコピーします。あとは立ち上げるだけで.sqlのデータがDBに反映されます。ファイル構成はこちらを参考にしていただくと簡単に構築できると思います。
コンテナ内のmysqlにログインするには以下を実行するのが楽です。
docker exec -it (docker ps -q) mysql -u root -p -D <database> -P <mysql_port>
- 投稿日:2020-02-24T14:51:36+09:00
MySQLのINSERTがうまくいかないときにやったこと+その他色々。
概要
管理ユーザー新規登録機能の実装をする段階で、クライアントからの入力情報がMySQLに登録されない(INSERTがうまくいかない)問題が発生。
解決のため小一時間ほど調査を試みた。不注意というか盲点というかツールに頼りすぎるなと教えられたというかまあそんな感じだが、とにかく同じミスをしないのが大事()前提
今回はPHP7系でPDOを用いたDB接続を採用。接続自体は成功しており、それに関する不具合は見受けられなかった。参考までに以下テーブルの中身やらソースやら。
【カラム情報】
・id:お約束のやつ。
・username:「name」が予約語というのを知らなかったのでusernameに。
・password1:パスワード入力用。
・password2:パスワード(確認)入力用。SignUp.php<?php //ユーザー新規登録 if(isset($_POST['signin'])){ $username = $_POST['username']; $password1 = $_POST['password1']; $password2 = $_POST['password2']; try{ $db = new PDO('mysql:host=localhost;dbname=ACCOUNT','root','root'); $sql = 'INSERT INTO USERS(username, password1, password2) VALUES(?, ?, ?)'; $stmt = $db->prepare($sql); $stmt->execute(array($username, $password1, $password2)); $stmt = null; $db = null; }catch(PDOException $e){ echo $e->getMessage(); exit; } } ?>※password1とpassword2は後から追加実装する予定なので今回は割愛。
とりあえずクエリログを見る
DBはあんまり積極的にエラー吐いてくれないから、とりあえずログを確認してご機嫌をうかがう。
mysql> show full processlist\G; *************************** 1. row *************************** Id: 147 User: root Host: localhost db: ACCOUNT Command: Query Time: 0 State: starting Info: show full processlist 1 row in set (0.00 sec) ERROR: No query specifiedふむ。バッチリだめです、と。
今度はphpMyAdminの方を少しばかり覗いてみることに。
やっぱり。。。
テーブル編集で一つ一つ確認してみたところ案の定ですわ。idにauto_increment指定がされてない、、、
実にけしからん。
その他:文字コードもついでに編集
その後、入力画面からデータの登録までうまくいったのですが、文字コードも統一されてなかったようでして。
この際なのできちんと整備しておきました。あとで作業するとき、とんでもなく面倒になったりするとかいう話も聞いたので丁寧に丁寧に。mysql> show variables like "chara%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)こいつを、
mysql> show variables like "chara%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)こうします。latin1になっていた文字コードをutf8に変更しました。
ここら辺の設定が済んだらテーブルを再構築していきます。本当にめんどくさかったから今後はこのあたりの設定も最初に確認しておくべきだと思いました。ユーザー名:テスト
パス1:user1
パス2(確認用):user1で登録してみると、
mysql> select*from USERS; +----+-----------+-----------+-----------+ | id | username | password1 | password2 | +----+-----------+-----------+-----------+ | 1 | テスト | user1 | user1 | +----+-----------+-----------+-----------+ 1 row in set (0.00 sec)やったぜ。
参照した先人たちの知恵は下記URLにてご参照をよろしくお願いします。全部わかりやすかった…涙
先人たちの知恵
・phpからmysqlのテーブルにINSERTできない
https://teratail.com/questions/12280・文字コードの確認と変更
https://proengineer.internous.co.jp/content/columnfeature/6653・MySQLの起動に関するもの(覚えられなくて度々お世話になってます)
https://qiita.com/macer_fkm/items/7013655da212b0efae6f・コンソールで文字コード設定を変更
https://qiita.com/user0/items/a9116acc7bd7b70ecfb0まとめ
・テーブルをつくる時はできるだけ漏れなく丁寧に設計。
・文字化け→文字コード設定を変える。時にはコンソール側の設定も修正してみる。基本的な機能の実装してると同時に周辺知識もどんどんついてくるなと思った(小並感)。
- 投稿日:2020-02-24T00:46:35+09:00
Rails6 Access denied for user 'root'@'localhost' (using password: NO)のエラー
目的
- 記事名のエラーが出た時の筆者の解決方法をまとめる
- とりあえずエラーを回避する方法をまとめる、MySQLのrootパスワードをRailsの設定ファイルに直接記載するので個人プロダクト以上のアプリでは本方法はオススメしない。
筆者の環境
- Rails version
- 6.0.2.1
- MySQL vsersion
- Ver 8.0.18 for osx10.13 on x86_64 (Homebrew)
- OS
- macOS 10.13.6
手順概要
- MySQLのrootパスワードを確認
- RailsのDB設定ファイルにMySQLのrootアカウントのパスワードを入力
- 接続確認
手順詳細
- MySQLのrootパスワードを確認
- すでに知っている方はこの手順は飛ばす。
- パスワードを失念した場合は下記の方法に従いパスワードを再設定する。
RailsのDB設定ファイルにMySQLのrootアカウントのパスワードを入力
- 下記のファイルを開く
- アプリ名ディレクトリ/config
- database.yml
パスワードを追加する。
password:
の後ろにMySQLのrootアカウントのパスワードを記入する。# MySQL. Versions 5.5.8 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html # default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: localhost接続確認
$ rails s
などを実行してローカル環境でエラーが出ないか確認する。