Marchan4
@Marchan4 (Marchan4)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

データベースに保存された書籍名を表示する、booklist2という名前のアプリをmysql2を使って起動させようとしたら、エラーが出てしまったため、そのエラーの解決方法を教えていただけますでしょうか。

使用環境はrubyバージョン3.0.0, bundlerバージョン2.2.3, homebrewバージョン3.0.10、mysqlバージョン5.7,  mysql2バージョン0.5.3です。
使用機器macOS Big Sur バージョン11.2.2です。使用中のテキストエディタはAtomです。

下記がrubyバージョン3.0.0がインストールされた証拠です。

$ ruby -v

ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-dar
win17]
$ rbenv versions

system
  2.4.0
  2.5.7
* 3.0.0 (set by /Users/ユーザ名/Downloads/プログ
ミング関連/booklist2/.ruby-version)

下記がbundlerバージョン2.2.3がインストールされた証拠です。

$ bundler -v

Bundler version 2.2.3

下記がhomebrewバージョン3.0.10がインストールされた証拠です。

$ brew -v

Homebrew 3.0.10
Homebrew/homebrew-core (git revision 032bac46a4; last commit 2021-03-31)

Homebrew/homebrew-cask (git revision 373bc16837; last commit 2021-03-31)

下記がmysqlバージョン5.7がインストールされた証拠です。

$ mysql --version

mysql  Ver 14.14 Distrib 5.7.32, for osx10.16 (x86_64) using  EditLine wrapper

下記がmysql2バージョン0.5.3がインストールされた証拠です。

$ bundle exec irb -
r mysql2

irb(main):001:0> Mysql2::VERSION

=> "0.5.3"

irb(main):002:0> exit;
$ bundle exec ruby
-e "require 'mysql2'; puts Mysql2::VERSION"

0.5.3

フォルダ内容は以下の通りです。

booklist2
└bundle
  └config
└vendor
  └bundle
└views
  └booklist2.erb
└.ruby-version
└app.rb
└create_table_booklist2.sql
└Gemfile
└Gemfile.lock

下記の画像が、データベースに保存された書籍名を表示する、booklist2という名前のアプリをmysql2を使って起動させようとした時に出たエラーです。

エラー Mysql2__Error__ConnectionError at __page-0001(JPG画像).jpg

まず、Mysql2::Error::ConnectionError at /
Access denied for user 'root'@'localhost' (using password: NO)
というエラーが
「パスワードがないためroot@localhostユーザにアクセスできない」という意味だと思ったのですが、

私が実際にMySQLのログインパスワードを設定してるため、mysql2もMySQLと同じログインパスワードを設定した方がいいとこのエラーは言っておるのでしょうか。

下記がbooklist2/app.rbのソースコードです。

booklist2/app.rb

require 'sinatra'
require 'mysql2'

get '/' do
  client = Mysql2::Client.new(host: 'localhost', username: 'root', database: 'booklist2', encoding: 'utf8')
  @records = client.query("SELECT * FROM books ORDER BY created_at DESC")
  erb :booklist2
end

post '/' do
  client = Mysql2::Client.new(host: 'localhost', username: 'root', database: 'booklist2', encoding: 'utf8')

  # 書籍タイトルの保存
  book_title = params['book_title']
  statement = client.prepare('INSERT INTO books (book_title) VALUES(?)')
  statement.execute(book_title)

  # 書籍タイトルの一覧取得
  @records = client.query("SELECT * FROM books ORDER BY created_at DESC")

  erb :booklist2
end

上記のソースコードの5行目(下記の一文のソースコード)が

client = Mysql2::Client.new(host: 'localhost', username: 'root', database: 'booklist2', encoding: 'utf8')

エラーの原因なのですが、この一文のソースコードが間違ってるということなのでしょうか。

下記がbooklist2/views/booklist2.erbのソースコードです。

booklist2/views/booklist2.erb

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Booklist2</title>
  </head>
  <body>
    <%# フォームデータ送受信確認用コード(本番では削除) %>
    <div style="background-color: skyblue;">
      <p>動作確認用: <%= params %></p>
    </div>
    <a href="/"><h1>Booklist2</h1></a>
    <h2>書籍の登録フォーム</h2>
    <form action="/" method="POST">
      <input type="text" name="book_title" placeholder="書籍タイトルを入力" required>
      <input type="submit" name="submit_add_book" value="登録">
    </form>
    <h2>登録された書籍一覧</h2>
    <ul>
      <% @records.each do |record| %>
        <li><%= ERB::Util.html_escape(record['book_title']) %></li>
      <% end %>
    </ul>
  </body>
</html>

あと、下記がbooklist2/create_table_booklist2.sqlです。

CREATE TABLE booklist2.books (
  id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  book_title VARCHAR(100),
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

あと、下記がデータベースbooklist2のbooksテーブルです。

mysql> SELECT * FROM booklist2.books;
+----+-----------------------------------------------------------+---------------------+
| id | book_title                                                | created_at          |
+----+-----------------------------------------------------------+---------------------+
|  1 | 非エンジニアのためのプログラミング講座                    | 2021-03-31 14:53:34 |
|  2 | プログラミングRuby                                        | 2021-03-31 14:54:48 |
|  3 | 入門HTML5                                                 | 2021-03-31 14:57:07 |
+----+-----------------------------------------------------------+---------------------+
3 rows in set (0.15 sec)
0

2Answer

6.2.7 アクセス拒否エラーの原因

Access denied というエラーメッセージは、ログインしようとしているユーザー名、接続を試行しているクライアントホスト、およびパスワードを使用したかどうかを通知します。通常では、エラーメッセージ内で指定されたホスト名およびユーザー名に正確に一致する 1 つの行を user テーブル内に持つようにします。たとえば、using password: NO というメッセージを含むエラーメッセージを受け取る場合、パスワードなしでログインしようとしたことを意味します。

ユーザにパスワードを設定しているならば、
パスワード無しでログインしようとしたので拒否された、
ということではないでしょうか。

0Like
  client = Mysql2::Client.new(
    host: 'localhost',
    username: 'root',
    database: 'booklist2',
    encoding: 'utf8',
  )

こちらで,パスワードを指定していないので,

Access denied for user `root`@`localhost` (using password: NO)

→ 「パスワード無し」を使用して, ユーザ: root,ホスト名 : localhost でのアクセスを拒否します.

ということなので,

  • ユーザが root でアクセスしたいなら,root のパスワードを指定する
  • ユーザが別にあるなら,そちらのユーザ名パスワードを指定する.

のどちらかが良さそうです.

  • :username
    • ユーザ名
  • :password
    • パスワード

が指定できそうです.

mysql コマンドで接続はできていると思うので,
その接続に使っているのと同じ設定が使えると良いかもしれません.

0Like

Comments

  1. @Marchan4

    Questioner

    回答いただきありがとうございました。booklist2/app.rbにmysqlバージョン5.7のログインパスワードを設定致しましたところ、booklist2というアプリがブラウザ上で起動いたしました。

    本当にご丁寧に回答していただきありがとうございました。
  2. 解決できたなら良かったです!

Your answer might help someone💌