20201020のMySQLに関する記事は11件です。

MySQLにホームディレクトリ.my.cnfの認証情報でログインに失敗する

はじめに

本番環境を仕様書にして検証環境を構築している最中のこと。
本番環境のシェルスクリプトがmysqlコマンドをユーザID、パスワードを渡さずに実行しています。ユーザID、パスワードは、ホームディレクトリの.my.cnfファイルに定義されていたので、検証環境も同じように定義しました。(本番環境、検証環境でパスワードは異なる)
検証環境でシェルスクリプトを実行すると、MySQLのログインに失敗し実行エラーが発生する。
それが解決できたので、同じ事象が起きた時のために情報をまとめます。

環境

  • CentOS Linux release 7.8.2003 (Core)
  • mysql Ver 8.0.22

ログインできないケース

認証情報の定義

.my.cnf
[client]
user = root
password = Pass1234#

ログイン実行結果

console
[root@dev01 ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

原因

もしかして、パスワードの#がコメントの始まりとして無視されているのではないか?
パスワードをダブルクォーテーションで括ってみます。

.my.cnf
[client]
user = root
password = "Pass1234#"
console
[root@dev01 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.22 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

今度はログインできました!

最後に

検証環境でシェルスクリプトが正常実行できるようになりました。
設定ファイルの設定値が文字列の場合は、クォーテーションで括ったほうが良いのかな。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

yps並走備忘録 Task7 Web-APIとAjax通信を利用したアプリケーションの作成(1ページアプリ)

というわけで2020/10/20日現在数名の方が沼にハマっていると思われるTask 7ですが、足跡を残すことで少しでも助けになればと思い、本記事にやったことなどをまとめていきます。

下準備:MySQLのデータを引っ張ってくる

まずはTask 3 : SQL:テーブル作成(復習)の手順と下記のQiita記事を参考にMySQL公式サイトからサンプルデータを引っ張ってきます。

参考:【SQL】MySQL公式サンプルデータベースを使う

+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

アプリ構築&jsライブラリ導入

上記テーブルが作成されたらTask6同様、アプリケーションを構築してDBと連携させましょう。

アプリケーションが構築できたらいよいよ今回の目玉のjsライブラリを下記記事を参考に導入しましょう

参考: 今すぐ導入可能!JavaScriptで3Dの地球上にデータを可視化できる「Gio.js」を使ってみた!

本タスクに関してはおススメはCDNを使うか、jsファイルをwget等でDLしてpublicに配置した上で読み込むこと。
(自分はnpm使って読み込んだのですが、この方法だとjsを記述して挙動を変更した際などに反映を確認するのにいちいちLaravel Mixを使わないといけなくなってしまい、結構面倒でした)

jsファイルをBlade内のヘッダーで読み込んだら一先ず地球儀を表示してみましょう

<div id="globalArea" style="width:800px;height:420px"></div>

全画面にする場合はスタイルの指定をwidth:100vw; height:100vh;にすればおk

次に、JavaScript側からこの「divタグ」を取得して3Dの地球を生成します。
こちらもbladeに直書きが一番手っ取り早い

const container = document.getElementById( "globalArea" );
const controller = new GIO.Controller( container );

controller.init();

これで一先ず地球儀が表示されるはず。簡単ですね。

レーザービーム発射!

次はこの地球儀にデータを突っ込んでレーザービームを出してあげましょう。
three.jsとgio.jsを読み込んだ次の行で次のスクリプトを読み込んであげます。

<script src="https://raw.githack.com/syt123450/giojs/master/assets/data/sampleData.js"></script>

そのあとにcontroller.init()関数の前後に下記を記述するだけです。

controller.addData(data);

こんな感じの表示になりました。
image.png

ここまでは比較的簡単ですね。

公式ドキュメントは英語ですがザックリ説明すると輸出国(e)と輸入国(i)の2桁のISO国コードと値(v)をまとめたjsonデータをcontroller.addData()関数で渡してやるとビームが出るそうです。

なので最大問題はどうやってそんな『いい感じのデータ』を探すかなんですが、いい感じのデータを提供してくれるAPIを探すというのがこのタスク最大の沼なので、一先ずそっちは置いておいて、まずはMySQLのデータをAjax通信で取得するのを先にやっちゃうのがおススメです。

Ajax通信によるデータの取得

Ajaxはザックリ言うと『画面変遷を行わずにデータを取得し処理を実行するための技術』です。
これに関しては補足説明が出ていますので、下記の一連のツイートと参考サイトを見ながらやってみましょう。
(なお、本タスクではjQueryを使用してAjax通信を行います)

参考:
yps task7:補足説明
yps task7:補講
Ajaxの説明とJQueryによる簡易実装

とりあえずオレオレデータを使ってMySQL⇒Laravelのエンドポイント⇒Ajaxで取得までできればタスクの半分はクリアです。

最大の敵はWEB-API!

本タスクで最も大きなハマりポイントはここですね。

  1. 日本語のドキュメントのあるAPIで世界規模のデータを扱っているものが少ない
  2. 英語のドキュメントはそもそも難易度がVERY HARD

というところで、非常に難航している方が多そうです。

日本語のドキュメントがあるAPIとしてはypsの委員長ことmiyupakaさんが使っているRESAS-APIe-statの中から日本対海外の貿易関係のデータを利用するのが比較的難易度が低いかと思います。

いずれにしても今回の課題の最大の難関、WEB-APIに関しては

  1. APIのドキュメントを読んだ上で
  2. クエリパラメーターを把握し
  3. 返ってくるデータ構造を把握し
  4. 返ってきたデータをいい感じに成形(ごにょごにょ)して
  5. 最終的にフロントのcontroller.addData()関数にいい感じのjsonに変換して渡す

という一連の操作を行うプログラムを組めるかどうかのテストだという認識です。

具体的にどんな風に進めたのかはまた別記事にまとめたいと思います。
(一先ずここまで…)

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

yps並走備忘録 Task7 Web-APIとAjax通信を利用したアプリケーションの作成(1ページアプリ)①

というわけで2020/10/20日現在数名の方が沼にハマっていると思われるTask 7ですが、足跡を残すことで少しでも助けになればと思い、本記事にやったことなどをまとめていきます。

下準備:MySQLのデータを引っ張ってくる

まずはTask 3 : SQL:テーブル作成(復習)の手順と下記のQiita記事を参考にMySQL公式サイトからサンプルデータを引っ張ってきます。

参考:【SQL】MySQL公式サンプルデータベースを使う

+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

アプリ構築&jsライブラリ導入

上記テーブルが作成されたらTask6同様、アプリケーションを構築してDBと連携させましょう。

アプリケーションが構築できたらいよいよ今回の目玉のjsライブラリを下記記事を参考に導入しましょう

参考: 今すぐ導入可能!JavaScriptで3Dの地球上にデータを可視化できる「Gio.js」を使ってみた!

本タスクに関してはおススメはCDNを使うか、jsファイルをwget等でDLしてpublicに配置した上で読み込むこと。
(自分はnpm使って読み込んだのですが、この方法だとjsを記述して挙動を変更した際などに反映を確認するのにいちいちLaravel Mixを使わないといけなくなってしまい、結構面倒でした)

jsファイルをBlade内のヘッダーで読み込んだら一先ず地球儀を表示してみましょう

<div id="globalArea" style="width:800px;height:420px"></div>

全画面にする場合はスタイルの指定をwidth:100vw; height:100vh;にすればおk

次に、JavaScript側からこの「divタグ」を取得して3Dの地球を生成します。
こちらもbladeに直書きが一番手っ取り早い

const container = document.getElementById( "globalArea" );
const controller = new GIO.Controller( container );

controller.init();

これで一先ず地球儀が表示されるはず。簡単ですね。

レーザービーム発射!

次はこの地球儀にデータを突っ込んでレーザービームを出してあげましょう。
three.jsとgio.jsを読み込んだ次の行で次のスクリプトを読み込んであげます。

<script src="https://raw.githack.com/syt123450/giojs/master/assets/data/sampleData.js"></script>

そのあとにcontroller.init()関数の前後に下記を記述するだけです。

controller.addData(data);

こんな感じの表示になりました。
image.png

ここまでは比較的簡単ですね。

公式ドキュメントは英語ですがザックリ説明すると輸出国(e)と輸入国(i)の2桁のISO国コードと値(v)をまとめたjsonデータをcontroller.addData()関数で渡してやるとビームが出るそうです。

なので最大問題はどうやってそんな『いい感じのデータ』を探すかなんですが、いい感じのデータを提供してくれるAPIを探すというのがこのタスク最大の沼なので、一先ずそっちは置いておいて、まずはMySQLのデータをAjax通信で取得するのを先にやっちゃうのがおススメです。

Ajax通信によるデータの取得

Ajaxはザックリ言うと『画面変遷を行わずにデータを取得し処理を実行するための技術』です。
これに関しては補足説明が出ていますので、下記の一連のツイートと参考サイトを見ながらやってみましょう。
(なお、本タスクではjQueryを使用してAjax通信を行います)

参考:
yps task7:補足説明
yps task7:補講
Ajaxの説明とJQueryによる簡易実装

とりあえずオレオレデータを使ってMySQL⇒Laravelのエンドポイント⇒Ajaxで取得までできればタスクの半分はクリアです。

最大の敵はWEB-API!

本タスクで最も大きなハマりポイントはここですね。

  1. 日本語のドキュメントのあるAPIで世界規模のデータを扱っているものが少ない
  2. 英語のドキュメントはそもそも難易度がVERY HARD

というところで、非常に難航している方が多そうです。

日本語のドキュメントがあるAPIとしてはypsの委員長ことmiyupakaさんが使っているRESAS-APIe-statの中から日本対海外の貿易関係のデータを利用するのが比較的難易度が低いかと思います。

いずれにしても今回の課題の最大の難関、WEB-APIに関しては

  1. APIのドキュメントを読んだ上で
  2. クエリパラメーターを把握し
  3. 返ってくるデータ構造を把握し
  4. 返ってきたデータをいい感じに成形(ごにょごにょ)して
  5. 最終的にフロントのcontroller.addData()関数にいい感じのjsonに変換して渡す

という一連の操作を行うプログラムを組めるかどうかのテストだという認識です。

具体的にどんな風に進めたのかはまた別記事にまとめたいと思います。
(一先ずここまで…)

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+vue.jsでサービス開発する際の一連の流れ(1)〜環境構築編〜

LaravelとVue.jsを使ってサービスを開発しました。その過程でやったことと、参考にした記事などを書いていきます。備忘録兼、私と同じような初心者の道標になるような記事になれば良いなと思います。

環境
・Laravel(5.8.38)
・Vue.js
・MAMP

プロジェクト作成

開発に必要なファイル一式が揃ったフォルダを作成します。プロジェクト作成には2種類の方法があります。

  • laravel new
  • composerコマンド

laravel newを使うと最新バージョンのLaravelがインストールされるようです。僕は5.8系を使いたかったので、composerコマンドを使いました。

ターミナル
% composer create-project "laravel/laravel=(Laravelのバージョン)" (プロジェクト名)

僕の場合、実際のコマンドは下のようになりました。
MAMPを使用しているので、cd /Applications/MAMP/htdocsでhtdocsディレクトリに移動し、実行します。プロジェクト名は、laravel_exampleとします。

ターミナル
% composer create-project "laravel/laravel=5.8.*" laravel_example

すると、パッケージがズラーッとインストールされ、laravel_exampleディレクトリが作成されました。
laravel_exampleディレクトリに移り、Laravelのバージョンを確認します。

ターミナル
% php artisan -v
Laravel Framework 5.8.38

ちゃんと5.8系のLaravelがインストールされました。

参考記事:【Laravel入門】プロジェクト作成から起動まで

ディレクトリ構造

先ほどインストールしたディレクトリの配下に、appディレクトリとかconfigディレクトリとか、いろいろ入ってます。
最初はあまり気にしなくていいと思うし、覚える必要もないと思います。開発をしていくと勝手にこの辺には何が入ってる、というのはわかってきます。一応、公式の解説ページを載せときます。
Laravel 5.8 ディレクトリ構造
ちなみに、この公式のドキュメント、開発するにあたってめちゃくちゃお世話になります。簡潔にまとまっている分初心者にはちょっと難しく感じられ、読むのを避けがちです。
しかし、ググっても解決できず、気が進まないながらも公式ドキュメントを読んだら簡単に解決できた、ということが少なからずありました。

データベース(mysql)の設定

データベースの作成

まず、今回の開発で使うデータベースを作成しましょう。
プロジェクトのrootディレクトリ直下にて(ここでなくても良いかもしれないが)

ターミナル
% mysql -u root -p
Enter password: 

すると、パスワードの入力を求められます。僕の場合、特に何も設定していなかってのでパスワードはrootです(ユーザー名もroot)。入力するとmysqlが起動し、ターミナルの表示が%からmysql>に変わります。
既に存在するデータベース一覧はSHOW DATABASES;で表示できます。最後の「 ; 」を忘れないようにしましょう。

ターミナル
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| mysql              |
| php_sample01       |
| sample             |
| sample2            |
| sys                |
| wordpress          |
+--------------------+
8 rows in set (0.03 sec)

データベースを作成するコマンドは

ターミナル
mysql> CREATE DATABASE (データベース名);

僕の場合、下のようになりました。データベース名もlaravel_exampleにしました。なんでも良いと思います。

ターミナル
mysql> CREATE DATABASE laravel_example;
Query OK, 1 row affected (0.00 sec)

もう一度データベースの一覧を見てみると、laravel_exampleが作成されていることが確認できます。

ターミナル
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel_example    |
| mysql              |
| performance_schema |
| php_sample01       |
| sample             |
| sample2            |
| sys                |
| wordpress          |
+--------------------+
9 rows in set (0.00 sec)

参考記事:MySQLをMacのターミナルで操作するときのメモ

Laravelのデータベース設定

作成したデータベースをLaravelで使えるように設定します。先ほど作ったディレクトリ(僕ならlaravel_exampleディレクトリ)の中にあるファイルを修正します。

  • .env (プロジェクトのルートディレクトリ直下にあります。)
  • database.php (configディレクトリにあります。)

.env

.envファイルとは?

.envファイルを使って開発環境と本番環境を切り替えたり、データベースなどの接続情報の変更を行うことができます。つまりLaravelにとって重要な設定変更このは.envファイルを介することで簡単に行うことができます。例えば開発環境では簡易に利用できるsqliteのデータベースに接続し、本番環境ではmysqlのDBに接続といった変更が可能です。
参考記事:入門者のためのLaravel .envファイルの基礎と理解

とりあえずは、この.envファイルに情報を入力していけば、開発環境の設定ができます。
.envの中でデータベースに関わる部分は以下の通りです。

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel  (データベース名)
DB_USERNAME=root     (ユーザー名)
DB_PASSWORD=         (パスワード)

これを修正していきましょう。
DB_CONNECTION、DB_HOST等の項目の意味は下の記事を参考に。
参考記事:保存版!Laravelの.envでできること大全

僕の場合、mysqlの設定は変更していないので、ユーザー名もパスワードもrootのままでした。一応、MAMPを使っている場合はサーバーをオンにした後に自動で表示されるページにも載っています。(下の画像の赤枠で囲んだところです)
データベース名はさっきCREATE DATABASEで作成したものを記入します。

スクリーンショット 2020-10-19 12.57.42.png

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_example
DB_USERNAME=root
DB_PASSWORD=root

画像をよく見ると、Socket /Applications/MAMP/tmp/mysql/mysql.sockとも書いてありますね。これも.envに追加しておきましょう。
ちなみに、下記のsqlコマンドを打っても、socketを取得できます。

ターミナル
mysql> SHOW VARIABLES LIKE '%sock%';
+-----------------------------------------+-----------------------------------------+
| Variable_name                           | Value                                   |
+-----------------------------------------+-----------------------------------------+
| performance_schema_max_socket_classes   | 10                                      |
| performance_schema_max_socket_instances | -1                                      |
| socket                                  | /Applications/MAMP/tmp/mysql/mysql.sock |
+-----------------------------------------+-----------------------------------------+
3 rows in set (0.00 sec)
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_example
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

これで.envファイルの設定、つまり、開発環境の設定がほぼ完了しました。

database.php

開発環境の設定が「ほぼ」完了した、と言いましたが、それは.envに設定した内容をLaravelに反映させる必要があるからです。
configディレクトリ内にあるdatabase.phpファイルで、.envに書いたデータベース情報を読み込んでいます。

※ちなみに、database.php.envのデータベース情報を読み込んでいるのと同様に、mail.phpではメールの情報を、cache.phpではキャッシュの情報を.envから読み込むといった感じになっています。

今回使うのはmysqlなので、database.php内のmysqlの部分を修正していきましょう。

database.php
'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

env()はヘルパ関数(Laravelが用意してくれている便利メソッド)で、第1引数で.envの値を取得、第2引数は.env内に値がなかった場合のデフォルトの値を設定します。

個人的には、第2引数は全て''で良いのでは?と思います。
なぜなら、サービスを作り終えてサーバーにデプロイする際(開発環境から本番環境に切り替える際)、デフォルト値を下手に設定していたせいでエラー地獄に陥ったからです。

具体的には、本番環境ではunix_socketを設定する必要がなかったのですが、

database.php
'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),

と書いていたためにデフォルト値の/Applications/MAMP/tmp/mysql/mysql.sockが設定されてしまいエラーになるなど。
デプロイ時にこうなることを避けるために、僕はデフォルト値(第2引数)は全部空にしておこうと思います。
(複数人で開発する際には、環境を合わせるためにデフォルト値を設定しておいた方が良いのかも?)

database.php
'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', ''),
            'port' => env('DB_PORT', ''),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

これで開発環境の設定は完了です。

動作確認

実際に正しくテーブルが作成できるか試してみましょう。
プロジェクトのルートディレクトリに移動し、

ターミナル
% php artisan migrate

Laravelはusersテーブルとpassword_resetsテーブルを作成するためのファイルを予め準備してくれており、このコマンドを打つことでテーブルが作成されます。

ターミナル
laravel_example % php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.03 seconds)

mysqlを確認しましょう。
use (データベース名); で使用するデータベースを選択し、show tables;でそのデータベースに登録されているテーブルを表示できます。

ターミナル
mysql>use laravel_example;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;
+---------------------------+
| Tables_in_laravel_example |
+---------------------------+
| migrations                |
| password_resets           |
| users                     |
+---------------------------+
3 rows in set (0.00 sec)

usersテーブルとpassword_resetsテーブルがしっかり作成されています!

ちなみに、Laravelにはテーブル作成の巻き戻しをするコマンドもあります。

ターミナル
php artisan migrate:rollback

php artisan migratephp artisan migrate:rollbackはセットで覚えときましょう。後々たくさん使います。

ターミナル
laravel_example % php artisan migrate:rollback
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table (0 seconds)

コマンド入力後、テーブルを確認してみると・・・

ターミナル
mysql> show tables;
+---------------------------+
| Tables_in_laravel_example |
+---------------------------+
| migrations                |
+---------------------------+
1 row in set (0.00 sec)

usersテーブルとpassword_resetsテーブルが削除されています。
ちゃんとデータベースを操作できているようですね。

デバッグ

最後にデバッグの設定です。LarabelではデバッグのON,OFFも簡単に設定できます。
デバッグをONにするには.envファイルにて

.env
APP_DEBUG=true

とするだけです。これはconfigディレクトリのapp.phpで読み込まれています。

app.php
/*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

ここに書かれている通りで、APP_DEBUGtrueなら、作成中のアプリケーションでエラーが起きると、エラーが起きるまでの過程とエラーメッセージを画面に表示してくれます。
falseなら、シンプルなエラーページが表示されるだけです。
サービスを公開する時には、falseにするのを忘れないようにしましょう。

スタックトレース (stack trace)とは

APP_DEBUG=trueの場合
スクリーンショット 2020-10-20 20.52.14.png

APP_DEBUG=falseの場合
スクリーンショット 2020-10-20 20.55.27.png

以上で環境構築編は終了です。あとはジャンジャン開発していきましょう!
続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】開発環境構築 Rails6 / Ruby2.7 / MySQL8

はじめに

DockerでRails6, MySQLにて環境構築をする際になかなかてこずってしまったので、備忘録もかねて記事に残します。

つまずいた部分として、
Rails5 とは異なり Rails6 ではモダンなフロントエンド開発を強力にサポートするWebpackをRuby on Railsで使うためのgemパッケージであるWebpackerの導入が必須となったことがある。

※Docker初心者であり各ファイルの記述についても理解できていない部分も多いです。

環境・バージョン

  • Macbook Air Catalina
  • Ruby 2.7
  • Rails 6
  • MySQL 8.0

環境構築完了までの手順

  1. プロジェクトのフォルダを用意
  2. 5つのファイルを用意
  3. 各ファイルを記述
  4. Rails プロジェクトの開始(rails new)
  5. Dockerイメージのビルド
  6. database.yml の編集
  7. DBを作成(db:create)
  8. コンテナを起動

実際に環境構築してみる

1. プロジェクトのフォルダを用意

任意の名前のフォルダを作成する(コマンドでなくてもOK)

mkdir dockerSampleApp 

2. 5つのファイルを用意

1.で作成したフォルダ内にファイルを作成する

  • Dockerfile
  • docker-compose.yml
  • Gemfile
  • Gemfile.lock
  • entrypoint.sh

3. 各ファイルを記述

Dockerfile

プロジェクトのフォルダ名に関係なくmyappの箇所はmyappのままでOKです。

Dockerfile
FROM ruby:2.7

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 \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
volumes:
  mysql-data:
    driver: local

Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'

Gemfile.lock

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 "$@"

4. Rails プロジェクトの開始(rails new)

コマンドを実行

$ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker --api

今回使用オプションについて

  • --force 既存のGemfileを上書きする
  • --no-deps リンクしたサービスを起動しない
  • --database=mysql データベースにMySQLを指定
  • --skip-test Minitest のインストールをスキップ(テストはRSpecを導入予定のため)
  • --webpacker webpacker をインストール(Rails6 では必須のパッケージ管理ツール)
  • --api APIだけ作りたいためAPIモードで実行。これにより不要なView・UI関連のライブラリがインストールされない。

※オプションについては適時カスタムして使用する

5. Dockerイメージのビルド

イメージビルドとは、各種依存ライブラリやミドルウェアをインストールしたり、自分のアプリケーションをインストール・設定したりすること。

コマンドを実行

$ docker-compose build

6. database.yml の編集

database.ymlの該当部分を修正。
docker-compose.ymlservicesMYSQL_ROOT_PASSWORDの設定に合わせて該当箇所を修正。

config/database.yml
# ~ 省略 ~

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password  # -> 空欄を password に修正
  host: db  # -> localhostから db に修正

# ~ 省略 ~

7. DBを作成(db:create)

コマンドを実行してDBを作成

$ docker-compose run web rails db:create

8. コンテナを起動

最後にコマンドを実行してコンテナを起動する

$ docker-compose up

少し時間がかかるかもですが、ターミナルにこんなログが流れればOK

web_1  | => Booting Puma
web_1  | => Rails 6.0.3.4 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 4.3.6 (ruby 2.7.2-p137), codename: Mysterious Traveller
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop

localhost:3000にアクセスすると無事ページが表示される。はず!!

最後に

なんとか環境構築ができました!
今後Dockerなどインフラ面についても学習して理解を深めて行きたいです!

参考資料

大変参考にさせていただきました!

ありがとうございました!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SELECT文について

SQLのSELECT文について学習をしたので、記録として残しておきます。

SQLとは

  • SQLとはデータベースを操作するための言語。Structured Query Languageの略。
  • データを定義するDDL,データを操作するDML,データを制御するDCLの3つに分類される。

SELECT文基本構文

  • SELECT文はDMLのうちの1つ。基本構文は以下のとおり。
SELECT <カラム名> FROM <テーブル名>;

<カラム名>に複数の項目を指定することも可能。

SELECT カラム名1,カラム名2・・・ FROM <テーブル名>;

<カラム名>に*を指定することで全てのカラムのデータを取得できる。

SELECT * FROM <テーブル名>;

order by 句

並び変えを行うことができる
order by カラム名 DESC or ASCで降順or昇順に並び替え可能。(ASCは省略可能、DESCの場合は必要)

ORDERBY
SELECT * 
From users 
ORDER BY age ASC;

この場合、usersテーブルの全ての値を年齢順(昇順)で並び替えて取得できる。

where 句

条件を指定してデータを取得できる
SELECT <カラム名> FROM <テーブル名> WHERE 条件で使用する。

WHERE
SELECT * 
From users 
WHERE id = 1;

条件以外のデータを取得したい場合は!=または<>を使用する。

and、or

WHERE句に続けてANDやOR使うと条件を並べて指定することができる。

AND
SELECT  カラム名1,カラム名2・・・ 
FROM   users
WHERE   first_name = "鈴木"
AND     age > 20

andの場合はAかつB、orの場合はAまたはBという意味になる。

GROUP BY

指定のデータをグループ化するときに用いる。

GROUPBY
select <カラム名> from <テーブル名> GROUP BY <グループ化する要素名>;

count句

GROUP BYによってグループ化されたデータの件数をカウントする。

COUNT
SELECT open_time,
COUNT('open_time')
FROM shops
GROUP BY open_time;

実行結果↓

open_time COUNT('open_time')
5:00:00 7
6:00:00 2
7:00:00 6

とりあえずここまで。
グループ化に関しては、集計関数も大きく関係しているみたいなので学習を進めつつアウトプットしていきます!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelマイグレーションでDB構築~Seederで初期データ投入するまで

マイグレーションとは

マイグレーションとは、PHP MyAdminから行うような、データベースにテーブルを追加作成したり、カラムを追加、変更、削除したり…といった作業を、コマンド一発で簡単にできる機能です。
もちろん、環境が変わった場合でも使えるので、マイグレーションを使ったことがない人には是非、覚えて欲しい機能です。

マイグレーションの手順

1. マイグレーションファイルを作成する

コマンドを使って簡単にマイグレーションファイルを作成することが出来ます。

2. 作成されたマイグレーションファイルに、処理を記述する

テーブル作成や、カラム追加、削除などの処理をPHPで記述します。
記述方法については、以下でご紹介します。

3. マイグレーションを実行する

コマンドを使って、マイグレーションを実行します。
マイグレーション実行後、データベースに変更や追加が反映されているか確認します。

Doctrine DBALライブラリーの導入

Laravelは、defaultではカラム変更のmygrationは実行出来ないため、Doctrine DBALライブラリーを追加する必要があります。

導入手順

Laravelルートディレクトリへ移動して、以下のコマンドを実行します。

composer require doctrine/dbal

※Version差異によるエラーが出ることあり

導入の確認方法

laravel/composer.jsonを開いてdoctrine/dbalが追加されていればOK

    "require": {
        "php": "^7.1.3",
        "doctrine/dbal": "^2.9",//※追加
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0",
        "nesbot/carbon": "^2.16.0",

※以下のカラムタイプのみ変更可能
bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger and unsignedSmallInteger

1:マイグレーションファイル作成

Laravelでデータベースを扱うために、テーブル作成とモデルファイル作成の方法をご紹介します。

Laravelでテーブルを作成するコマンド

例:XXXテーブルを作成

php artisan make:migration [マイグレーションファイル名] --create=[テーブル名]
php artisan make:migration create_XXX_table --create=XXX

※マイグレーションファイル名はそのままクラス名になるので、分かりやすい名前をつけること
※生成出力先のパスを指定したい場合は、make:migrateコマンドの実行時に--pathオプションを付ける。(Laravelルートディレクトリからの相対パスで指定)

例:Reservationsテーブルを作成する場合
php artisan make:migration create_reservations_table --create=reservations

上記のコマンド実行すると、以下のようなファイルが生成されます。
マイグレーション用ファイル:コマンド実行日時+create_reservations_table.php
作成される場所:プロジェクトフォルダ\database\migrations

※この段階ではまだテーブルは作成されていません。

生成されたファイル

create_reservations_table.phpを開いてみます。
「CreateReservationsTable」というクラス名でファイルが生成されているのが確認できます。

upメソッド

upメソッド内にテーブル追加・変更の内容を記述していきます。
ここに記述された内容が、マイグレート(migrate)コマンドを叩いた時に、実行される処理です。

public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }
downメソッド

ここにはロールバック(rollback)した時に、実行される処理を記述します。
例えば、ロールバック時、テーブルを削除したい場合は以下のように記述します。

    public function down()
    {
        {
            Schema::dropIfExists('reservations');
        }
    }

マイグレーション実行

とりあえずテーブルを作成してみたいので、マイグレーションを実行してみます。
以下のコマンドを叩きます。

php artisan migrate

以下のように「Migrated」と表示されればOK。マイグレーション実行は成功しています。

Migrating: 2020_10_19_154405_create_reservations_table
Migrated:  2020_10_19_154405_create_reservations_table (37.32ms)
実行されたSQL文を確認するコマンド

実行されたSQL文を確認したい場合は、以下のコマンドを叩きます。

php artisan migrate --pretend

全テーブルを削除してマイグレーションをやり直したい場合

php artisan migrate:reset

resetコマンドはdown メソッドを呼び出し、アプリケーション全部のマイグレーションをロールバックします。
実行後、DBのmigrationsテーブルが空になっているのが確認できます。

※resetコマンドはあくまでもロールバックのみなので、テーブル削除+マイグレーション再実行を一発で済ませたい場合は、refreshコマンドを使うと便利です。

カラムの追加、名前変更、属性変更、削除

ここまでの手順後、カラムの追加、名前変更、属性変更、削除が必要な場合は、それ用のファイルを別で作成し、再度マイグレーションを実行します。

カラム名を変更

まず、カラム変更用のマイグレーションファイルを作成するため、以下のようにコマンドを叩きます。

php artisan make:migration rename_変更前のカラム名_to_変更後のカラム名_on_テーブル名_table --table=テーブル名

作成されたファイルを開いて編集します。

カラム名を変更する:renameColumnメソッド

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

※カラムタイプがenumのカラム名変更は、Version5.5時点ではサポートされていない

カラム属性の変更

まず、カラム属性変更用のマイグレーションファイルを作成するため、以下のようにコマンドを叩きます。

php artisan make:migration changecolumn_属性変更するカラム名_テーブル名_table --table=テーブル名

作成されたファイルを開いて編集します。

カラム属性を変更する:changeメソッド

例:nameカラムのサイズを25から50へ増やす

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

カラムの追加

既存テーブルにカラムを追加する

生成されたファイルを編集

    public function up()
    {
        Schema::table('abc;', function (Blueprint $table) {
            $table->integer('test')->default(0)->index('index_test')->after('aaa')->comment('新カラム');
        });
    }

カラム追加時の修飾子

  • afterメソッド:どのカラムの後に追加するかを指定
  • nullableメソッド:null値許容
  • nullableメソッドに引数false指定:not null
  • 型指定:tinyInteger('test')
  • default null挿入:nullable($value = true)
  • TIMESTAMPカラムのデフォルト値をCURRENT_TIMESTAMPに指定:useCurrent()

※第二引数はauto_increment、第三引数はprimary keyの指定なので、String型のように第二引数は長さの指定ではないことに注意

カラムの削除

既存テーブルを削除:dropColumnメソッド

引数に配列を渡して複数削除可

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});

DBに初期データを投入(Insert)

マイグレーションでDBを構築したら、シーディングで初期データを投入してみます。

Seedファイルの生成

投入データ用Seedファイルを生成するため、以下のコマンドを実行します。
※Reservationsテーブルへのシーダーを生成するのであれば「ReservationsTableSeeder」といったクラス名にする

php artisan make:seeder ReservationsTableSeeder

以下が表示されればOK。作成

Seeder created successfully.

データ投入の記述

プロジェクトフォルダ\database\seeders\配下にReservationsTableSeeder.phpファイルが生成されているので、開いてデータを投入する記述を追加します。

ReservationsTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;//←追加

class ReservationsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //ここにデータを投入する記述
    }
}

1レコード分の投入であれば以下のように記述します。複数レコードは、配列でその下に追加します。

ReservationsTableSeeder.php
       DB::table('users')->insert([
        [
            'name' => '木村',
            'email' => 'kimura@XXX.co.jp',
            'password' => '123456',
            'user_id' => 'kimura3',
            'auth_id' => 1,
            'last_login_date' => date('Y-m-d H:i:s'),
        ],

実行時に呼び出す記述を追加

シーダクラスを定義したら、このシーダクラスをシーディング実行時に呼び出す記述を追加します。
seedsディレクトリ内DatabaseSeeder.phpに以下を記述します。登録したいシーダクラスが複数ある場合は、ここに配列で追加します。

DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            ReservationsTableSeeder::class,
         ]);
    }

}

シーディングの実行

プロジェクトフォルダで以下コマンドを実行します。

php artisan db:seed

ファイル名を指定して実行する場合

上の手順で呼び出し用の記述をDatabaseSeeder.phpにしましたが、optionでファイル名を指定する場合は、記述しなくても実行できます。

php artisan db:seed --class=UsersTableSeeder

DB確認

テーブルにデータが作成されている事が確認できます。

LaravelでModelを作成するコマンド

例:XXXモデルを作成

php artisan make:model XXX

上記コマンド実行後、プロジェクトルート/appにXXX.phpというModelファイルが作成されているのが確認できます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AnsibleでMySQLをいじるときの参考記事

CentOS7だとmariadbが入ってて邪魔だったり、パスワード変更が面倒だったりしますよね
ansibleでどうにかmysqlを弄りたい時に参考になる記事を発見したのでQiitaの民も検索できるように共有します。

MySQL 8のAnsibleハマりポイント(rootのパスワード変更とか) - そうなんでげす

あとは以下の公式ドキュメントを読めば、データベース作成もできるので十分かと!
mysql_db - Add or remove MySQL databases from a remote host. — Ansible Documentation

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel7マイグレートエラー(SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint)

Laravelで、タグ付けのできる投稿サイトをチームで制作しています。
投稿テーブル(reviews)を先に作っていたのですが、今回タグテーブル(tags)を作成し、reviewsとはreview_tagという中間テーブルで多対多のリレーションを作成したいです。
しかし、マイグレートした時にエラーで少しだけ苦しんだのでメモしておきます。

問題点はここ

$ php artisan migrate

Migrating: 2020_09_19_035606_create_tags_table
Migrated:  2020_09_19_035606_create_tags_table (0.08 seconds)
Migrating: 2020_09_19_053140_create_review_tag_table

   Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `review_tag` add constraint `review_tag_tag_id_foreign` foreign key (`tag_id`) references `tags` (`id`) on delete cascade)

外部キーが設定できないぜと仰っているようです。いろいろ調べると、主キーidの設定でBIGINTとINTは両立できない模様

エラーになった時の3つの各テーブルのマイグレーションファイルは下のようになっていました。主キーを設定している箇所にご注目ください。

reviewsテーブルのマイグレーションファイル↓

XXXXXX_create_reviews_table.php
class CreateReviewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('reviews', function (Blueprint $table) {
            $table->id();//BIGINTの主キー
            $table->date('live_date');
            $table->string('title', 255);
            $table->text('text');
            $table->timestamps(0);
            $table->foreignId('user_id')->constrained('users');
        });
    }

tagsテーブルのマイグレーションファイル↓

XXXXXX_create_tag_table.php
class CreateTagsTable extends Migration
{
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');//BIGINTではないid主キー
            $table->string('tag_name', 30);
            $table->string('info');
            $table->string('url');
            $table->timestamps();
        });
    }

review_tag中間テーブルのマイグレーションファイル↓

XXXXXX_create_review_tag_table.php
public function up()
    {
        Schema::create('review_tag', function (Blueprint $table) {
            $table->increments('id');//BIGINTではないid主キー
            $table->timestamps();
            $table->foreignId('review_id')->constrained('reviews')->onDelete('cascade'); //foreignIdはunsignedBigIntegerのエイリアス
            $table->foreignId('tag_id')->constrained('tags')->onDelete('cascade'); //foreignIdはunsignedBigIntegerのエイリアス
        });
    }

こう解決しました

まず、MySQLにてdrop table テーブル名;でtagsとreview_tagを一旦削除。
次に、tagsとreview_tagのマイグレーションファイルにて、$table->increments('id');$table->id();に変更。
(正直、reviewsと中間テーブルを挟んで間接的にしか繋がってない(?)tagsテーブルの方のマイグレーションファイルのidも修正が必要だったのかは不明...)
こうして再度マイグレートしたら、エラー出ずに上手くいきました。

$ php artisan migrate
Migrating: 2020_09_19_035606_create_tags_table
Migrated:  2020_09_19_035606_create_tags_table (0.03 seconds)
Migrating: 2020_09_19_053140_create_review_tag_table
Migrated:  2020_09_19_053140_create_review_tag_table (0.09 seconds)

以上になります。ごもし指摘などあれば、ぜひよろしくお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

もはや DB は Docker でインストールする時代!初心者のための DB インストール on Docker

この記事について

データベース、これは 2020 年になっても、エンタープライズなどのアプリケーション開発において、必ずと言っていいほど使用されるものだと思います。
ただ、従来同様、本番環境や検証環境、開発環境に至るまで、未だに人力で頑張ってホスト OS に直接インストールしている方が多いというのが現状です。

(少し誇張が過ぎるかもですが)
開発環境のデータベースのインストールに 5 分以上時間をかけるのは時間の無駄です!

今、このタイミングで、Docker でサクッと DB をインストールできることを覚えましょう。
ただし、本番環境など、冗長化構成や可用性を担保する必要がある場合などは、きちんと要求に合致したインストール方法を実施をしましょう。

Oracle Database on Docker

※ちょっとインストール方法が面倒なので、後日追記します。早く情報を知りたい方は、参考情報に記載の内容をご参照ください。

SQL Server on Docker

GitHub にて公開しているこちらのリポジトリを参考に、docker-compose.yaml を作成してください。
※下記の yaml は RHEL ベースの SQL Server (on Linux) on Docker です。
※GitHub のリポジトリでは、ブランチで RHEL ベースと Ubuntu ベースの 2 つを用意しています。(2017 は Ubuntu のみ)

docker-compose.yaml
version: '3'

services:
  mssql:
    image: mcr.microsoft.com/mssql/rhel/server:2019-latest
    container_name: 'mssql2019-latest-rhel'
    environment:
      - MSSQL_SA_PASSWORD=<your_strong_password>
      - ACCEPT_EULA=Y
      # - MSSQL_PID=<your_product_id> # default: Developer
      # - MSSQL_PID=Express
      # - MSSQL_PID=Standard
      # - MSSQL_PID=Enterprise
      # - MSSQL_PID=EnterpriseCore
    ports:
      - 1433:1433
    # volumes: # Mounting a volume does not work on Docker for Mac
    #   - ./mssql/log:/var/opt/mssql/log
    #   - ./mssql/data:/var/opt/mssql/data

docker-compose up -dで、コンテナーを起動すれば、SQL Server のインストールは完了です。

docker-compose up -d

MySQL on Docker

GitHub にて公開しているこちらのリポジトリを参考に、docker-compose.yaml を作成してください。

docker-compose.yaml
version: '3'

services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: P@ssw0rd #required
      # MYSQL_DATABASE: employees #optional
      # MYSQL_USER: user #optional
      # MYSQL_PASSWORD: P@ssw0rd #optional
      # MYSQL_ALLOW_EMPTY_PASSWORD: "yes" #optional
      # MYSQL_RANDOM_ROOT_PASSWORD: "yes" #optional
      # MYSQL_ONETIME_PASSWORD: "yes" #optional (MySQL 5.6 or above)
      # MYSQL_INITDB_SKIP_TZINFO: "" #optional
    ports:
        - 3306:3306
    volumes:
        - ./data/mysql:/var/lib/mysql
        - ./conf:/etc/mysql/conf.d

docker-compose up -dで、コンテナーを起動すれば、MySQL のインストールは完了です。

docker-compose up -d

PostgreSQL on Docker

GitHub にて公開しているこちらのリポジトリを参考に、docker-compose.yaml を作成してください。

docker-compose.yaml
version: '3'

services:
  db:
    image: postgres:13
    container_name: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: P@ssw0rd #required
      # POSTGRES_USER: postgres #optional
      # POSTGRES_DB: postgres #optional
      # POSTGRES_INITDB_ARGS: "--data-checksums" #optional
      # POSTGRES_INITDB_WALDIR: "" #optional (PostgreSQL 10+ or above)
      # POSTGRES_INITDB_XLOGDIR: "" #optional (PostgreSQL 9.x only)
      # POSTGRES_HOST_AUTH_METHOD: trust #optional
      # PGDATA: /var/lib/postgresql/data/pgdata #optional
    ports:
        - 5432:5432
    volumes:
      - ./data:/var/lib/postgresql/data

docker-compose up -dで、コンテナーを起動すれば、PostgreSQL のインストールは完了です。

docker-compose up -d

MongoDB on Docker

GitHub にて公開しているこちらのリポジトリを参考に、docker-compose.yaml を作成してください。

docker-compose.yaml
version: '3'

services:
  mongo:
    image: mongo:latest
    container_name: mongodb
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: P@ssw0rd
    ports:
        - 27017:27017
    volumes:
        - ./data/db:/data/db
        - ./data/configdb:/data/configdb
    # Command 1: Customize configuration without configuration file
    # Command 2: Setting WiredTiger cache size limits
    # command: >
    #   --serviceExecutor adaptive
    #   --wiredTigerCacheSizeGB 1.5

  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: P@ssw0rd

docker-compose up -dで、コンテナーを起動すれば、MongoDB のインストールは完了です。

docker-compose up -d

管理ツール

管理ツールについては、各自好きなものを使用すれば良いと思いますが、おすすめは Visual Studio Code を使う方法です。
Docker Compose も DB 操作も Visual Studio Code 内で行えるため、とても便利です。
詳細は以下の記事を参照してください。

また、MySQL と PostgreSQL のところで記載している adminer のコンテナーを一緒に作るのもアリかと思います。

参考情報

Oracle Database

SQL Server

MySQL

PostgresSQL

MongoDB


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでMySQLにログインできなかった(ERROR 1698 (28000))

はじめに

UbuntuにMySQLをインストールし、DB操作を始めようとしたところ、
エラーが吐き出されてログインできなかったので、その解決方法を書き記します。

この記事でわかること

ERROR 1698 (28000)を解決する方法として以下のふたつがわかります。
しかし本質的な解決ではないので、その場しのぎに使ってもらえたらと思います。

  • sudoを使ってMySQLにログインする方法
  • アカウントを作ってMySQLにログインする方法

実行環境

  • Ubuntu 20.04
  • MySQL 8.0.21
  • Virtual Box 6.1

MySQLにログインできなかった

UbuntuにMySQLを導入し、初期アカウントとなるrootでログインしようとしたところ以下のエラーメッセージが出ました。

$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

エラーコードをもとに色々調べてみたところ、auth_socket pluginなるものが関係しているようなのですが、、
私にはよく分からず。

root にアクセス権限が設定されていないことで起こる
 ERROR 1698 (28000)- Access denied for user 'root'@'localhost' で MySQL にrootでログインできない

上記のようなことが発生しているらしいです。
こちらのサイトに書かれているのは本質的な解決方法に感じるので、参照すると より幸せになれると思います。
私の知識不足により、現時点ではその中身を正しく理解できなかったため、本記事ではこれ以上言及しません(言及できません)。

解決方法(暫定的な解決方法)

1.管理者権限でログインする

管理者権限でログインすることで、MySQLにログインすることができました。

$ sudo mysql

とりあえずこのコマンドで入れば、ひと通り動きはします。
しかし、アカウントという概念を無視しているようで、スマートに感じられなかったため、
別の解決方法も探すことにしました。

2.管理者権限でログインしたあと、アカウントを作る

$ sudo mysql

mysql> create user "hogeName" identied by "fooPassword";

このあとターミナルを再起動し、
作成したユーザー名と、そのパスワードを入力することで無事ログインができました。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む