データベースに保存された書籍名を表示する、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 /
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)