20200728のMySQLに関する記事は9件です。

Mac×Laravel×MAMPで環境構築からデータベース接続まで

さっそくタイトルにある通り進めていきましょう。

MAMPのインストール

MAMPの公式サイトにアクセスします。

https://www.mamp.info/en/

Free Downloadをクリックします。

macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。

無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。

MAMPが起動後、Start Servers をクリックすることで、

Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。

しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。

MAMPの設定

メニュー内 MAMP から Preferences をクリックします。
スクリーンショット 2020-07-28 21.30.02.png

Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
スクリーンショット 2020-07-28 21.31.20.png

初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、

一般的には、

Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、

特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。

Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。

以上でMAMPのインストールおよび設定が完了です。

composerのインストール

PHPのライブラリやパッケージを管理するcomposerというツールがあります。

Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。

https://getcomposer.org/

インストール後、コマンドプロンプトでcomposer --versionと入力してください。

$ composer --version
 Composer version 1.4.2

このようにバージョンが表示されればOKです。

Laravelのインストール

composerがインストールされている状態で、htdocsディレクトリに移動します。

初期設定でインストールした場合は下記フォルダになるかと思います。

$ cd /Application/MAMP/htdocs

htdocsフォルダに移動後、下記のコマンドを入力してください。

$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名

Laravelの起動

作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。

$ php artisan serve

と入力し、

$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
[Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.ico

と表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。

こんな画面が表示されればOKです。

スクリーンショット 2020-07-28 21.42.02.png

phpmyadminでデータベース作成

スクリーンショット 2020-07-28 21.44.36.png
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
スクリーンショット 2020-07-28 21.47.51.png

下にスクロールして、
スクリーンショット 2020-07-28 21.48.07.png
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
スクリーンショット 2020-07-28 21.52.24.png
ここで、任意の名前のデーターベースを作成しましょう。

MAMPの情報を控える

そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
スクリーンショット 2020-07-28 21.48.09.png

.envの修正

デフォルトだと以下のようになっています。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=

これを、MAMPの情報を元に、以下のように変えます。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
DB_DATABASE=先ほど作ったデータベース名
DB_USERNAME=root
DB_PASSWORD=root

次はdatabase.phpです。

database.phpの修正

デフォルトのdatabase.phpはこうなっています。

'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),

それを、以下のように変えます。

'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', '先ほど作ったデータベース名'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'root'),

以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!

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

Mac×Laravel×MAMPで開発環境構築からデータベース接続まで

さっそくタイトルにある通り進めていきましょう。

MAMPのインストール

MAMPの公式サイトにアクセスします。

https://www.mamp.info/en/

Free Downloadをクリックします。

macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。

無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。

MAMPが起動後、Start Servers をクリックすることで、

Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。

しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。

MAMPの設定

メニュー内 MAMP から Preferences をクリックします。
スクリーンショット 2020-07-28 21.30.02.png

Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
スクリーンショット 2020-07-28 21.31.20.png

初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、

一般的には、

Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、

特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。

Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。

以上でMAMPのインストールおよび設定が完了です。

composerのインストール

PHPのライブラリやパッケージを管理するcomposerというツールがあります。

Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。

https://getcomposer.org/

インストール後、コマンドプロンプトでcomposer --versionと入力してください。

$ composer --version
 Composer version 1.4.2

このようにバージョンが表示されればOKです。

Laravelのインストール

composerがインストールされている状態で、htdocsディレクトリに移動します。

初期設定でインストールした場合は下記フォルダになるかと思います。

$ cd /Application/MAMP/htdocs

htdocsフォルダに移動後、下記のコマンドを入力してください。

$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名

Laravelの起動

作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。

$ php artisan serve

と入力し、

$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
[Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.ico

と表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。

こんな画面が表示されればOKです。

スクリーンショット 2020-07-28 21.42.02.png

phpmyadminでデータベース作成

スクリーンショット 2020-07-28 21.44.36.png
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
スクリーンショット 2020-07-28 21.47.51.png

下にスクロールして、
スクリーンショット 2020-07-28 21.48.07.png
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
スクリーンショット 2020-07-28 21.52.24.png
ここで、任意の名前のデーターベースを作成しましょう。

MAMPの情報を控える

そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
スクリーンショット 2020-07-28 21.48.09.png

.envの修正

デフォルトだと以下のようになっています。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=

これを、MAMPの情報を元に、以下のように変えます。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
DB_DATABASE=先ほど作ったデータベース名
DB_USERNAME=root
DB_PASSWORD=root

次はdatabase.phpです。

database.phpの修正

デフォルトのdatabase.phpはこうなっています。

'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),

それを、以下のように変えます。

'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', '先ほど作ったデータベース名'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'root'),

以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!

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

【初心者・備忘録】Win10+Rails+MySQLで新規プロジェクト立ち上げ

新規立ち上げまでにエラーに数回引っかかったので
備忘録として。

開発環境

  • Windows10
  • Ruby 2.6.6
  • Rails 5.2.4.3
  • MySQL 8.0.20

手順

  1. コマンドでrails new アプリ名 -d mysqlを実行
    • (-d mysqlでデフォルトのSQLiteからMySQLへデータベース変更ができる)
  2. MySQLで新規user作成 ※allグローバル権限を与える
  3. 新規userのパス認証をcatching_sha_passwordからmysql_native_passwordへ変更
  4. Railsアプリ内のdatabase.ymlファイル開く→使用するMySQLのusername、passwordに書き換える
  5. Railsアプリ内のgemfileファイル開く→MySQLの項目を自分が使っているバージョンに書き換える
  6. コマンドでbundle installを実行
  7. コマンドでrails db:createを実行→Railsがデータベース生成してくれる!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け?】SQL超マスター〜複雑なテーブルにへこたれない編〜【Railsとの比較あり】

はじめに

Railsを利用していると、普通に使っている分にはどんなSQLが発行されるんだろう?ということを考えずとも、欲しいレコードが簡単に取得できますよね。Railsを学び始めた頃からすごいな〜と思っていましたが、今になってもやはり凄いなと思います。

ただ1つ、便利だからこそ生じる弊害があります。それは

>>>SQLが書けなくなる<<<

別に、「SQLが書けなくてもActiveRecordとかが頑張ってくれるから困らないじゃん」と思っている方もいらっしゃるかもしれません。私もそう思っていました。
しかし、例えRailsであっても、テーブル構造が複雑になってくると、どんなSQLを発行したいのか?という部分が分からないと、Railsでどう書いたらデータが取れるのか?というのが分からなくなります。

業務中に、そういった場面と直面する機会が最近格段に増え物凄く困った、危機感を持った、というのが私の体験談であり、結果として「やばい、SQL勉強し直そう」と思うきっかけとなりました。
なんとなくで Rails でレコードを取得している方は、この記事で一緒に学び直しましょう!

環境

  • Docker for Mac 2.3.0.3
  • Ruby 2.6.6
  • Rails 6.0.3
  • MySQL 8.0
  • DBeaver 7.1.0

環境構築

  1. こちらからリポジトリをcloneする
  2. $ docker-compose buildを実行
  3. $ docker-compose up -dを実行
  4. $ docker-compose exec web rails db:create を実行
  5. $ docker-compose exec web rails db:migrateを実行
  6. $ docker-compose exec web rails db:seed を実行
  7. こちらの記事を参考に、MySQLDBeaverを接続する
  8. DBeaver との接続後、students テーブルにレコードが 6 件登録されていることを確認できればOK

※DBeaver との接続時、MySQL の root パスワードを要求されると思います。
パスワードは docker-compose.ymlMYSQL_ROOT_PASSWORD に指定した値を入力してください。(未設定の場合は password が設定されます。)

今回使用するテーブル

スクリーンショット 2020-06-23 14.50.09.png

初級編〜SELECTの基礎を学ぶ〜

※ここからはDBeaverSQLコンソールを使用していきます。sql_master_developmentがデフォルト選択されるよう設定を行って下さい。

universitiesテーブルのレコードを全件取得する

手始めに universitiesテーブルのレコードを全件取得してみましょう。これは簡単ですね!

universitiesテーブルのレコードを全件取得する
 select * from universities;

これは Railsだと以下のようになります。

University.all

特定のUniversityのレコードを取得する

では、次はnameUniversityAのレコードを全件取得しましょう。

nameUniversityAのレコードを全件取得する
 select * from universities where name = 'UniversityA';

これはRailsだと以下のようなイメージです。

University.where(name: 'UniversityA')

whereが出て来たので、find_bySQLで書いてみましょう。
※1件のみ取得したい時はlimitを使用します。

nameUniversityAのレコードを1件取得する
 select * from universities where name = 'UniversityA' limit 1;

中級編 テーブルを結合して、欲しいレコードを取得する

UniversityAに紐づいた studentsレコードを全件取得する

テーブル結合について(簡易版)

universitiesテーブルとstudentsテーブルはuniversity_studentsという中間テーブルによって紐づけられています。

そのため、該当レコードを取得するためにはテーブル同士の結合が必要になります。
テーブル結合には内部結合(JOIN/INNER JOIN)外部結合(LEFT JOIN)があります。

  • 内部結合・・・あるカラムの値が一致しているレコードを取得し、結合して表示する
  • 外部結合・・・あるカラムの値が一致していない場合でもテーブルを結合し、全件表示する

今回のような場合は 内部結合外部結合か考えながら、まずは最終的に欲しい情報であるstudentsテーブルと中間テーブルである university_studentsテーブルを結合して、studentsレコードを全件取得してみましょう。

※結合の構文は inner join(left join) 結合するテーブル名 on 結合先テーブル名.カラム名 = 結合するテーブル名.カラム名

nameUniversityAのレコードを1件取得する
 select students.* from students inner join university_students on students.id = university_students.student_id;

取得できましたか?
これはRailsだと以下のようになります。

Student.joins(:university_student)

結合したテーブルを使って、UniversityAに紐づいた studentsレコードを全件取得する

では、次は本題であるUniversityAに紐付いたstudentsレコードを全件取得していきましょう。
先ほどstudentsテーブルとuniversity_studentsテーブルを結合したので、今回は追加でuniversity_studentsテーブルとuniversitiesテーブルを結合します。

そして、universitiesレコードのnameカラムがUniversityAであるものを特定すると、UniversityAに紐づいた studentsレコードを全件取得することができます。

StudentAStudentFまで取得できていたらOKです :thumbsup:

UniversityAに紐づいた studentsレコードを全件取得する
select students.* from students
inner join university_students on students.id = university_students.student_id 
inner join universities on university_students.university_id = universities.id 
where universities.name = 'UniversityA';

これをRailsで書くと以下のようになります。

Student.joins(:university).where(universities: { name: 'UniversityA' })

この辺りから「Railsスゲー!!」という気持ちが大きくなってくるのではないでしょうか?
joins:universityのみの記述で良いのは、Model(Student)has_one :university, through: :university_studentを定義しているからです。

Railsは関連付けさえ綺麗に定義できれば上記のように記述をどんどん簡略化できるのでよいですね :thumbsup:

UniversityAに所属しているStudentAcourse_registrationsレコードを全件取得する

この辺から関連するテーブルが増えてきてごちゃごちゃします。
一つずつ紐解いて考えていきましょう。

ここでは UniversityA大学に所属しているStudentAさんのcourse_registrationレコード、つまり履修登録情報を取得します。

ここで簡単に仕様を説明します。
course_registrationsレコードは年度毎に作成されます。

StudentAさんは、2020年度の時点で2回生です。
そのため、course_registrationsレコードは2レコード作成されています。

studentsテーブルとcourse_registrationsテーブルはstudent_course_registrationsという中間テーブルを持っています。

UniversityA大学に所属しているStudentAさんのcourse_registrationレコードを全件取得する
select course_registrations.* from course_registrations
inner join student_course_registrations on course_registrations.id = student_course_registrations.course_registration_id
inner join students on student_course_registrations.student_id = students.id
inner join university_students on students.id = university_students.student_id 
inner join universities on university_students.university_id  = universities.id
where universities.name = 'UniversityA'
and students.name = 'StudentA';

これをRailsで書くとこうなります。

 CourseRegistration.joins(student: :university)
                   .where(
                     students: { name: 'StudentA' },
                     universities: { name: 'UniversityA' }
                   )

ここまで書いた私「Railsやばい」

自分で生のSQLを全部書く時間と比較してどうでしょう?Rails凄い。

さて、まだこれはテーブル結合として「まだ」優しいです。
この時点ではまだ、全て年度の履修を登録したという情報しか取得できていません。
最初のER図を見た時に少し嫌な予感がした、という方。正しい判断です。
次は ある年度に履修した全ての科目を取得してみましょう!

UniversityAに所属しているStudentA2020年度のCourseRegistration(履修登録情報)に紐付いたsubjectsレコードを全件取得する

見出しがカオスになってきました。
ただ、ここまでの知識を活かせばそう難しくないと思います。

subjectsテーブルとcourse_registrationsテーブルにも、例によってsubject_course_registrationsという中間テーブルがいます。
では、今までの知識を活かして取得してみましょう!

UniversityAに所属しているStudentA2020年度のCourseRegistration(履修登録情報)に紐付いたsubjectsレコードを全件取得する
select subjects.* from subjects
inner join subject_course_registrations on subjects.id = subject_course_registrations.subject_id 
inner join course_registrations on subject_course_registrations.course_registration_id = course_registrations.id
inner join student_course_registrations on course_registrations.id = student_course_registrations.course_registration_id
inner join students on student_course_registrations.student_id = students.id
inner join university_students on students.id = university_students.student_id 
inner join universities on university_students.university_id  = universities.id
where universities.name = 'UniversityA'
and students.name = 'StudentA'
and course_registrations.year = '2020';

これをRailsで書くと以下のようになります。

Subject.joins(course_registration: { student: :university })
       .where(
         universities: { name: 'UniversityA' },
         students: { name: 'StudentA' },
         course_registrations: { year: '2020' }
       )

やっぱりRailsって凄いですね。。。

UniversityAに所属するTeacherAが受け持っている科目 基礎英語2020年度に受講する生徒を全件取得する

subjectsレコードを取得したから、今度はどうせteachersレコードでも取得するんでしょうと思われた方もいるかもしれません。
ですが、恐らくワンパターンすぎて飽きてきたという方もいるでしょう。
私も流石に(ちょっともういいかな……)と思えてきたため、teachersレコードを追加するのは各自で試してみていただければ、と思います。

今度は生徒ではなく、教員側がデータベースに登録された情報を参照したい場合を考えてみます。

表題のようなレコードが欲しい、というケースですが、例えば 教員が 「今年度の出席簿を作りたいな……」と思った時に、履修対象者を全件取得したい、といった時に起こり得そうですね。

UniversityAに所属するTeacherAが受け持っている科目 基礎英語2020年度に受講する生徒を全件取得する
select distinct students.* from students
inner join student_course_registrations on student_course_registrations.student_id = students.id 
inner join course_registrations on course_registrations.id = student_course_registrations.course_registration_id 
inner join subject_course_registrations on subject_course_registrations.course_registration_id = course_registrations.id
inner join subjects on subjects.id = subject_course_registrations.subject_id
inner join subject_teachers on subject_teachers.subject_id = subjects.id
inner join teachers on teachers.id = subject_teachers.teacher_id
inner join university_teachers on university_teachers.university_id = teachers.id 
inner join universities on university_teachers.university_id = universities.id
where universities.name = 'UniversityA'
and teachers.name = 'TeacherA'
and subjects.name = '基礎英語'
and course_registrations.year = '2020';

これをRailsで書くと以下のようになります。

Student.joins(course_registrations: { subjects: { teachers: :university } })
       .where(
         course_registrations:{
           subjects: { name: '基礎英語' },
           teachers: { name: 'TeacherA' },
           universities: { name: 'UniversityA' },
           course_registrations: { year: '2020' }
         }
       )

上級(?)編 結合したテーブルを使って合計値を出す

各生徒ごとの総取得単位を取得する

ただレコードをとるだけでは面白くないので、次は生徒の名前と、総取得単位を取得し閲覧したいと思います。

取得するのは以下のようなデータです。

student_name total_credit
StudentA 13
StudentB 13
StudentC 8
StudentD 7
・・・ ・・・

今回は 生徒ごとの単位の合計を出すので、studentsテーブルとsubjectsテーブルの情報が必要になります。

1人の生徒には年度ごとに履修登録情報が紐づいていて、履修登録情報各科目の情報が紐づいている、というのは一度SQLを書いたので問題ないと思います。

キモとなるのは、1人ずつ 単位の合計値をまとめたいという点だと思います。
情報をまとめたい場合は GROUP BYを使います。

group by (カラム名)

また、カラムの合計値を出す時は SUM関数を使います。

sum(カラム)

そして、先程の表を見ると、少しヘッダーの表示がカラム名と異なっていたと思います。
ASでエイリアスをつける必要がありそうですね。

上記のことを踏まえて、SQLを書いてみましょう!

各生徒ごとの総取得単位を取得する
select students.name  as student_name, sum(subjects.credit) as sum_credit FROM students
inner join student_course_registrations ON student_course_registrations.student_id = students.id 
inner join course_registrations ON course_registrations.id = student_course_registrations.course_registration_id 
inner join subject_course_registrations ON subject_course_registrations.course_registration_id = course_registrations.id
inner join subjects ON subjects.id = subject_course_registrations.subject_id
group by students.name

これはRailsで書くと以下のようになります。

 Student.joins(course_registrations: :subjects)
        .group('students.name')
        .sum(:credit)

:rolling_eyes:

書く量が全然違いますよね。
ただ、これを書こうと思った時に、結局どんな感じのSQLが発行されて欲しいのか?というところがわからないと、「???」となると思います。(私は毎回そうなっていました)

また、「上みたいな場合だとRubyでなんとかできそうだから、mapとかeach_with_object使ってなんとかしちゃお」と私は思いがちだったのですが、純粋に値が必要なだけであればデータベースから直接取得できるので、Rubyでゴリ押すのではなく、いい感じのSQLを発行して必要な値を取得する、というのも必要なスキルだなと思いました :thumbsup:

最後に

親子関係のあるテーブルならまだ良いのですが、親子孫曽孫……のような構成のテーブルがあった時に、「親から曽孫ってどうやってとるんだ!?!?」と混乱することが多かったのですが、「どのテーブルのレコードが主人公になっているのか?」を意識しながら書いていくとそんなに複雑ではないということが分かったと思います。

また、Railsでレコードを取得する時も少し混乱してしまいがちですが、SQLのテーブル結合を意識するとシンプルに書いていくことができるので、こんなSQLが発行されて欲しい!というのを意識しながら書いていくと良いですね :thumbsup:

Railsでシンプルに書いていこうと思うと、Modelに定義する関連付けが大事だという話を少ししました。テーブルが複雑になればなるほど、この関連付けの定義も難しくなります(ここ最近私が頭を抱えているところです。)

次はRailsで条件付きの has_onehas_manyの定義の仕方を学べるようなQiitaが書けたらと思っています :thinking:

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

【mysql】Access denied for userが出たときの対処法

Mysql(ver8)の開発用DBを、さくっと作りたい人向け。
そして、せっかちでじっくりドキュメントを読みたくない人向けです。
コピペしたけど実行したら、うまくいかないって場合に読んでみてください。

そもそもちゃんとドキュメント読めという話は一旦置いておいて・・。

以下のようなエラーが出たときの対処法。

28000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)
42000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)

参考

ユーザを作成
ユーザに権限を設定

前提

Mysqlのデータベースは、「localhost」に構築済。
各コマンドは、rootユーザで実行。
作成するユーザは、ユーザID:test パスワード:test

1.データベースの作成

create database testDB;

2.ユーザの作成(コピペを間違える。。)

create user 'test'@'192.168.0.1' identified by 'test';

以下のエラーがでます。

28000Access denied for user 'test'@'192.168.0.1' (using password: YES)

2-1.ユーザの作成(やり直し)

一度、ユーザを削除

drop user 'test'@'192.168.0.1';

上記のdropコマンド実行後に以下コマンド

create user 'test'@'localhost' identified by 'test'; --localhostからのアクセスを許可

もしくは

create user 'test'@'%' identified by 'test'; --全hostからのアクセスを許可

3.DBに接続

接続しようとすると、権限が無いので、以下のエラーが発生。

42000Access denied for user 'test'@'localhost' (using password: YES)

3-1.権限の付与

※以下コマンドの「localhost」の部分は、適宜「%」にするなど、変更してください。

GRANT ALL ON testDB.* TO 'test'@'localhost'; --testDBに対するすべての権限を付与

もしくは

GRANT ALL ON *.* TO 'test'@'localhost'; --全DBに対するすべての権限を付与

これでデータベースを操作できるようになるはず。

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

サーバー二台でdocker + MySQLを用いてレプリケーション

ラズパイをサーバー化して環境構築をしているのですが、大苦戦中です。
CPUのアーキテクチャが組込用なので便利なdocker imageが全然使えないという。。。
SSL認証のときも大変でしたが、それはまた別の記事で。

※今回はラズパイをDBサーバーとしましたが、通常のオンプレサーバーであっても同じ書き方でできるはずです。

1.やりたいこと

1.1.レプリケーション

サーバー1にマスターDBをおき、サーバー2にスレイブDBをおいて、スレイブでマスターDBの更新を検知して全くDBを保持すること
片方のサーバーが物理的に壊れてもDBのデータは残ります。(うっかりdrop tableなんてオペミスは無理ですが)

1.2.レプリケーションの設定をdockerで簡略化

結構めんどくさいので、新しいサーバーにもdocker-compose up -dの1コマンドで環境を設定できたら楽です

2.手順

2.1.全体の構成

サーバー構成
192.168.0.2 → master用サーバー
192.168.0.3 → slave用サーバー

ディレクトリ構成

├── db
│ ├── Dockerfile
│ ├── conf
│ │ ├── master.cnf
│ │ └── slave.cnf
│ └── sql
│ ├── init_master.sql
│ └── init_slave.sql
├── docker-compose.yml

↑treeコマンドで表示したのですが、みづらいですねすみません。

2.2.docker-compose.ymlの作成

docker-compose.ymlにてdbディレクトリをビルドします
そしてdbディレクトリには必要な設定ファイルを仕込むのですが、まずはdocker-composeだけ載せますと

docker-compose.yml
version: '3'

services:
  db:
    build: ./db
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: db_name
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: 'Asia/Tokyo'。
    volumes:
      # 初期データを投入するSQLが格納されているdir
      - ./db/sql:/docker-entrypoint-initdb.d
      # 永続化するときにマウントするdir
      - /var/lib/mysql:/var/lib/mysql

build: ./dbにてdocker-compose.ymlと同じ階層のdbディレクトリをビルドしています。

2.3.dockerfileとconfigファイルの作成

次にdockerfileを書きます。
これは一部、マスターとスレーブで書き換えが要ります

Dockerfile
FROM mysql:5.7
# 読み込むconfファイルをマスターかスレーブかでコメントアウトして分岐させる
#ENV conf_file ./conf/slave.cnf
ENV conf_file ./conf/master.cnf

ADD $conf_file /etc/mysql/my.cnf
RUN chmod 644 /etc/mysql/my.cnf

これまではほとんどmasterとslaveで個別の設定はありませんでした。

次にmasterとslaveのそれぞれのconfファイルを設定していきます。

master.conf
[mysqld]
user=mysql
server-id = 1
log-bin
binlog-format = MIXED
slave.conf
[mysqld]
user=mysql
server-id=2
log-bin
read_only

2.4.DB初期化時に読み込まれるファイルの作成

次にdbディレクトリがビルドされるときの初期化のsqlを書きます

init_master.sql
-- slaveが使用するユーザーを設定(slaveのサーバーの内部IPに合わせる)
CREATE USER 'replica'@'192.168.0.3' IDENTIFIED BY 'replica';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.3';
init_slave.sql
-- MASTER_LOG_FILEやMASTER_LOG_POSの調べ方は後述
CHANGE MASTER TO MASTER_HOST='192.168.0.2', 
    MASTER_PORT=3306, 
    MASTER_USER='replica', 
    MASTER_PASSWORD='replica', 
    MASTER_LOG_FILE='3ae7abcabc-bin.000003', 
    MASTER_LOG_POS=1234;

init_slave.sqlのmaster_log_fileやmaster_log_posの調べ方ですが、マスターDBサーバーのコンテナに入って

$docker exec -it <container_id> bash
#mysql -u root -p password
>show master status\G;

こんな順番でコマンドを入力するとマスターのログファイルの位置が取得できます。
mysql 5.7以降だったか、わざわざこんなことをしなくても 
MASTER_AUTO_POSITION=1
と設定するだけでいけるとかなんとか

これでレプリケーションできるかと思います。

何もミスってなければslaveのサーバーにて

$docker exec -it <container_id> bash
#mysql -u root -p password
>show slave status\G;

こんな感じでDBコンテナに入ってコマンドを打つとずらーっと表示されますが

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

この2つのパラメータがYesになります
connectingとか書いてたらだめです。

ずらーっと表示されている下の方にエラー内容が出ます

Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 

※これは正常な状態です

ここに出てくるエラーナンバーやエラーメッセージを頼りにデバッグしたらできるかと思います。

どうしても自動化しきれていませんが、だいぶ再現するのが楽にはできたかなと思います。
何か補足があったらぜひお願いいたします。

あ、あと既にテーブルがあって運用中のDBをマスタースレーブ構成にしたい場合は、masterでダンプしてそのデータをslaveでリストアして反映する必要があります。

https://qiita.com/marienplatz/items/3255b2d7f7f922ab115a

こっちに書きましたので参考までに

参考
http://www.tohoho-web.com/ex/mysql-replication.html

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

Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

Procfileファイルの編集

Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。

web: vendor/bin/heroku-php-apache2 public/

varchar型の文字数を191に制限

app\Providers\AppServiceProvider.phpを編集する

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //この一行を追加

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191); // この一行を追加
    }
}

上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。

Githubに変更を保存しよう

この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。

add
commit
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ Reveal Config Varsにkeyとvalueを追加する

メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。

// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力)
DB_DATABASE = データベース名
DB_HOST = ホスト名
DB_PASSWORD = パスワード
DB_USERNAME = ユーザー名

// 追加でいれておくもの
DB_CONNECTION = mysql
APP_ENV = heroku
APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される)
APP_NAME = 任意の名前
LANG = ja_JP.UTF-8
TZ = Asia/Tokyo

手順②はコマンドでも操作できます

heroku config | grep CLEARDB_DATABASE_URL

手順③はコマンドでも操作できます

 heroku config:set DB_DATABASE= データベース名
 heroku config:set DB_HOST= ホスト名
 heroku config:set DB_USERNAME= ユーザー名
 heroku config:set DB_PASSWORD= パスワード
 heroku config:set APP_KEY=$(php artisan key:generate --show)
 heroku config:set APP_ENV=heroku
 heroku config:set LANG=ja_JP.UTF-8
 heroku config:set TZ=Asia/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Webサイトを確認

Open app をクリックします
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

Configにセットする

Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする

CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

コマンドでも操作できます

 heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

ここまでの【Reveal Config Vars】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(hostname)
  • ユーザー名(username)
  • パスワード(password)
  • データベース(dbname)

これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう

本番環境のデータが可視化できることを確認します。

まとめ

Laravelではデータベースとの接続情報は、.envに記載されている。つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。つまり今回でいうとClearDB MySQLの情報になる訳です。

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

Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

Procfileファイルの編集

Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。

web: vendor/bin/heroku-php-apache2 public/

varchar型の文字数を191に制限

app\Providers\AppServiceProvider.phpを編集する

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //この一行を追加

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191); // この一行を追加
    }
}

上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。

Githubに変更を保存しよう

この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。

add
commit
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ Reveal Config Varsにkeyとvalueを追加する

メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。

// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力)
DB_DATABASE = データベース名
DB_HOST = ホスト名
DB_PASSWORD = パスワード
DB_USERNAME = ユーザー名

// 追加でいれておくもの
DB_CONNECTION = mysql
APP_ENV = heroku
APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される)
APP_NAME = 任意の名前
LANG = ja_JP.UTF-8
TZ = Asia/Tokyo

手順②はコマンドでも操作できます

heroku config | grep CLEARDB_DATABASE_URL

手順③はコマンドでも操作できます

 heroku config:set DB_DATABASE= データベース名
 heroku config:set DB_HOST= ホスト名
 heroku config:set DB_USERNAME= ユーザー名
 heroku config:set DB_PASSWORD= パスワード
 heroku config:set APP_KEY=$(php artisan key:generate --show)
 heroku config:set APP_ENV=heroku
 heroku config:set LANG=ja_JP.UTF-8
 heroku config:set TZ=Asia/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Webサイトを確認

Open app をクリックします
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

Configにセットする

Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする

CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

コマンドでも操作できます

 heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

ここまでの【Reveal Config Vars】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(hostname)
  • ユーザー名(username)
  • パスワード(password)
  • データベース(dbname)

これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう

本番環境のデータが可視化できることを確認します。

まとめ

Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。

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

【初めてのデプロイ】Laravel×Herokuデプロイ(MySQL) + Cloudinary

はじめに

初めてLaravelでMySQLを使用したアプリをデプロイしてみたい方に向けた記事です。
この記事は既にLaravelアプリを作成済みである状態から説明します。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきます

Laravelアプリフォルダ直下にてProcfileを作成する

Procfileとは

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。

Procfileファイルの作成

コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する

touch Procfile

上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。

スクリーンショット 2020-07-27 午後8.54.57.png

Procfileファイルの編集

Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。

web: vendor/bin/heroku-php-apache2 public/

varchar型の文字数を191に制限

app\Providers\AppServiceProvider.phpを編集する

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //この一行を追加

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191); // この一行を追加
    }
}

上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。

Githubに変更を保存しよう

この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。

add
commit
push

Herokuでの作業

サインアップ

こちらをクリックしてherokuへの会員登録を行いましょう。

ログイン後~Heroku上でアプリの作成

Step1 アプリ作成①

ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
スクリーンショット 2020-07-27 午後9.16.01.png

Step2 アプリ作成②

【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
スクリーンショット 2020-07-27 午後9.18.23.png

Herokuアプリの設定

Step1 ClearDB MySQLの追加

初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。

スクリーンショット 2020-07-27 午後9.43.03.png

手順①

先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
スクリーンショット 2020-07-27 午後9.25.25.png

手順②

下記のページへと遷移されるので、【ClearDB MySQL】を探します。
スクリーンショット 2020-07-27 午後9.25.56.png

手順③

手順②で探しだした下記をクリックします。
スクリーンショット 2020-07-27 午後9.26.24.png

手順④

【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
スクリーンショット 2020-07-27 午後9.26.35.png

手順⑤

手順①ではなかったClearDB MySQLが追加できたのが確認できます。
スクリーンショット 2020-07-27 午後9.38.41.png

手順①〜⑤はコマンドでも操作できます

heroku addons:add cleardb

Step2 DB情報を確認し、Configにセットする

手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする

スクリーンショット 2020-07-27 午後9.49.12.png

手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする

スクリーンショット 2020-07-27 午後9.49.33.png

手順③ Reveal Config Varsにkeyとvalueを追加する

メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。

// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力)
DB_DATABASE = データベース名
DB_HOST = ホスト名
DB_PASSWORD = パスワード
DB_USERNAME = ユーザー名

// 追加でいれておくもの
DB_CONNECTION = mysql
APP_ENV = heroku
APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される)
APP_NAME = 任意の名前
LANG = ja_JP.UTF-8
TZ = Asia/Tokyo

手順②はコマンドでも操作できます

heroku config | grep CLEARDB_DATABASE_URL

手順③はコマンドでも操作できます(下記コマンドは1行ずつ実行します)

 heroku config:set DB_DATABASE= データベース名
 heroku config:set DB_HOST= ホスト名
 heroku config:set DB_USERNAME= ユーザー名
 heroku config:set DB_PASSWORD= パスワード
 heroku config:set APP_KEY=$(php artisan key:generate --show)
 heroku config:set APP_ENV=heroku
 heroku config:set LANG=ja_JP.UTF-8
 heroku config:set TZ=Asia/Tokyo

Step3 GithubとHerokuの連携

手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします

スクリーンショット 2020-07-27 午後10.20.40.png

連携コマンド操作

heroku git:remote -a herokuアプリ名;

手順①はコマンドでも操作できます

git push heroku master

マイグレーションの実行

heroku run php artisan migrate

Heroku上でGithubとHerokuを連携したあとに、マイグレーションを実行します
この際にエラーがでてしまうのは、GitとHerokuの連携がうまく行われていないことがおおいです。
その場合は、上記連携コマンド操作git push heroku masterをコマンドで実行しましょう。

Webサイトを確認

Open app をクリックします
ここまででLaravelアプリ(MySQL使用)のデプロイは完了です
スクリーンショット 2020-07-27 午後10.28.53.png

コマンドでも操作できます

heroku open

CloudinaryとHerokuの連携

既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。

Cloudinaryとは

画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。

Cloudinaryを使用する目的

本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。

Cloudinaryへログイン(ここから作業です)

Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。

Cloud name:
API Key:
API Secret:

スクリーンショット 2020-07-27 午後10.47.54.png

Configにセットする

Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする

CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

コマンドでも操作できます

 heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値
 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値
 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値

ここまでの【Reveal Config Vars】は下記のようにセットしてあります

スクリーンショット 2020-07-27 午後11.14.17.png

Herokuでアプリを開き挙動を確認しましょう

写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。

おまけ

GUIツールを使用して本番環境のDBを可視化しよう

  • macユーザー
  • windowsユーザー

Sequel pro使用方法

Table plusもやることは同じです。
適宜読み替えてトライしてください。

ダウンロードしたSequel proを立ち上げます

下記の図のように画面が表示されます。

スクリーンショット 2020-07-27 午後11.26.38.png

  • ホスト(hostname)
  • ユーザー名(username)
  • パスワード(password)
  • データベース(dbname)

これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう

CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう

本番環境のデータが可視化できることを確認します。

まとめ

Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。

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