0
0

More than 3 years have passed since last update.

railsのdbをsqlightからMysqlに変更する際に、bundle installでエラーが発生

Posted at

背景

  1. railsアプリのdbをsqlightからmysqlに変えようとしていた。
  2. database.ymlとgemを書き換えた
  3. bundle installをしたら, 以下のエラーが発生
> An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
> Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling."

試したこと

1.エラー内容にある通り、gem install~~を実行しても、解決しなかった。
2.ログの確認

> ld: library not found for -lssl
> clang: error: linker command failed with exit code 1 (use -v to see invocation)

で終わっていることを確認。

先人の知恵を検索

mysql2 インストール時に 「ld: library not found for -limported_openssl」が表示された場合の対応
bundle installでmysql2がエラーになる件
mysql2 gemインストール時のトラブルシュート

bundle installできた

$  brew info openss

> For compilers to find openssl@1.1 you may need to set:
>  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
>  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib" 
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"

$bundle install

mysqlのユーザーを作成して、ユーザーネームとパスワードを.envとdatabase.ymlに設定する

$ mysql.server stat
$ mysql -uroot
mysql> create user '[user_name]@localhost' indentified by '[password]';

#.env
MYSQL_USER_NAME='[user_name]'
MYSQL_PASSWORD='[password]'

しかし、Mysqlにコネクトできないエラー発生

$ bundle exec rake db:create

> Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
> Couldn't create 'db_development' database. Please check your configuration.
そもそも、datebase.ymlのsocketとは

databaseとwebアプリが通信する先に必要であるらしい

https://stackoverrun.com/ja/q/1099552

"2つのプログラムがネットワーク上でお互いに話をしたい場合には、一つのプログラムは、他の1とのTCP接続(「ソケット」)を開くかもしれません。最初のプログラムは、2番目のコンピュータのIPアドレスとプログラムがリッスンしているポートを知る必要があります。"

"Linuxでは、同じコンピュータ上の2つのプログラムが互いに通信したい場合でも、TCP接続を開くことができます。しかし、彼らはまた、 "ソケットファイル"経由で接続を開くことができます。 LinuxはTCP APIに似たソケットファイルAPIを作成するので、ソケットファイル経由の通信もサポートするためにTCP経由ですでにネットワーク経由で通信しているプログラムを更新するのは大したことではありません。ソケットファイルはTCPより高速ですが、両方のプログラムが同じコンピュータ上にある場合にのみ動作します"

database.ymlにあるsocketの記述を消すとエラーも消えた

しかし、もう一つのエラーは相変わらず発生している

> Couldn't create 'db_development' database. Please check your configuration.
> Mysql2::Error::ConnectionError: Access denied for user 'ENV["MYSQL_USER_NAME"]'@'localhost' (using password: YES)

database.ymlでの環境変数の記載方法が間違っていた

#.env

# 変更前
  username: ENV["MYSQL_USER_NAME"]
  password: ENV["MYSQL_PASSWORD"]

# 変更後
  username: <%= ENV["MYSQL_USER_NAME"] %>
  password: <%= ENV["MYSQL_PASSWORD"] %>

無事に”rails db:create”が成功

コンテナ内でも"rails db:create"、成功
bundle exec rspec コマンドも成功

結果、database.ymlはこうなる

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: portfolio1_development
  pool: 5
  username: <%= ENV["MYSQL_USER_NAME"] %>
  password: <%= ENV["MYSQL_PASSWORD"] %>

development:
  <<: *default
  database: portfolio1_development

test:
  <<: *default
  database: db_test

production:
  <<: *default
  database: portfolio1_production
  username: 

ちなみにdocker-compose.ymlはこうなる

docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - .:/myapp:delegated
  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3316:3306'
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0