20201208のMySQLに関する記事は5件です。

MyBatis内のSQL <![CDATA[ 比較演算子 ]]>

Mapper.xmlファイル内のSQLで引っかかったので個人的メモ。

Mapper.xml
'select  A.cutromer_id
        ,A.number
        ,case
           when B.customer is not null and B.customer <![CDATA[<>]]> ''
           else ''
         end AS C
 from A
 left join B
   on A.cutromer_id = B.cutromer_id'

MySQLに読み替える際、<![CDATA[ ]]>を除いて書き換える必要がありました。
*比較演算子はちゃんと書く。

MySQL.
'select  A.cutromer_id
        ,A.number
        ,case
           when B.customer is not null and B.customer <> ''
           else ''
         end AS C
 from A
 left join B
   on A.cutromer_id = B.cutromer_id'

MyBatisはXMLファイルにSQL文を定義して使用する。
XMLなので比較演算子が直接、使えないのがわかっていたつもりでした?

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

【Rails】既存のRails6プロジェクトにDockerを導入してみる

はじめに

既存のRailsプロジェクトをDockerに乗せていきます。
初学者による記事なので間違い等ございましたらご指摘いただけると幸いです。
※本記事は開発環境のみの導入を対象としています。

参考

Dockerが何なのか全く分からない!という方はまずは下記の記事を参考にDockerを触ってみてください。
DockerをMacにインストールする
こちらの記事も手っ取り早くDockerをふんわり理解するのにオススメです。
Dockerについてなるべくわかりやすく説明する

環境

  • macOS Catalina 10.15.7
  • Ruby 2.6.5
  • Rails 6.0.3.3
  • Docker 19.03.13
  • docker-compose 1.27.4
  • MySQL 5.6.47

目次

  • 必要ファイルの作成
    • ファイル構成
  • 作成したファイルの編集
  • コンテナの起動

必要ファイルの作成

必要ファイルは以下の5つです。rails newをした際に自動生成されるファイルもあるので必要なもののみ作成していきましょう。

  • Dockerfile
  • docker-compose.yml
  • Gemfile
  • Gemfile.lock
  • database.yml

ファイル構成

既存のアプリケーション名
└── app
     ├── Dockerfile  # 作成
     ├── docker-compose.yml  # 作成
     ├── Gemfile
     ├── Gemfile.lock
     ├── config
          └──database.yml

作成したファイルの編集

Dockerfile

Dockerfile
FROM ruby:2.6.5   #自身のrubyバージョンを指定 (ruby -v)

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    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

RUN apt-get update && apt-get install -y --no-install-recommends\
    nodejs \
    yarn \
    mariadb-client  \
    build-essential  \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /myproject

COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install
RUN yarn install --check-files

COPY . /myproject

Rails6でwebpackerが標準になったことでyarnのインストールが必要になってきます。
Docker Hubで確認するとrubyのイメージはDebian系となっているので、yarnの公式ドキュメントに記載されているOS毎のインストール方法を参考に記述していきます。
ちなみに、yarnの公式ドキュメントは日本語表示のままだとなぜかOSの選択肢の中にMacとWindowsしか表示してくれないので英語表示に切り替えて確認しましょう。

日本語表示
Screen Shot 2020-12-08 at 19.48.15.png
英語表示
Screen Shot 2020-12-08 at 19.48.30.png

docker-compose.yml

docker-compose.yml
version: '3'

services:
  db:   #データベースのコンテナ作成
    image: mysql:5.7   #自身のmysqlバージョンを指定 (mysql --version)
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - '3306:3306'
    volumes:
      - mysql-data:/var/lib/mysql 
    environment:
      MYSQL_DATABASE: myapp_development   #プロジェクト名_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password

  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:
      - .:/myproject
volumes:      #dbを永続化するための記述
  mysql-data:

Gemfile

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

既存アプリケーションの場合この記述はすでにあるはずですが念のため確認しておきましょう。

database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root   #docker-compose.ymlで指定したユーザー名
  password: password   #docker-compose.ymlで指定したパスワード

development:
  <<: *default
  database: myapp_development   #プロジェクト名_development
  host: db   #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名

test:
  <<: *default
  database: myapp_test   #プロジェクト名_test
  host: db   #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名

アプリケーションのコンテナからデータベースのコンテナに接続するための設定を記述していきます。
セキュリティ面を気にする場合はusernameとpasswordに環境変数を設定しましょう。今回は開発環境のみということもあり設定していません。

コンテナの起動

ターミナル
cd myapp
docker-compose build    #コンテナを建てる
docker-compose up -d   #コンテナ起動(-dオプションをつけることでバックグラウンドで実行)

これで localhost:3000 にアクセスするとページが表示されます◎

  • エラーが発生した場合は
ターミナル
docker-compose logs -f

でリアルタイムでログの確認ができるのでエラー原因を探して解決しましょう。

  • サーバーを停止させたいときは以下のコマンドを実行してください。
ターミナル
docker-compose down

最後に

実装に思いの外手間取ったので備忘録的に記事にしてみました。
どなたかの参考になれば幸いです。

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

Mysql入門【授業編】

XAMPPからmysqlにつないで、DB作成、テーブル作成の流れをやる

①XAMPP起動

startボタンを押す

②ターミナルに繋いで、mysql起動

open terminalをクリック。
その後、ターミナルが開いたら
mysql

そして、MariaDB [(none)]>が表示されたら、オッケー。

③データベースに繋ぐ


既存のDBに繋ぐ。
use データベース名

④確認系のコマンド

今あるテーブルの一覧を表示
show tables;
+---------------+
| Tables_in_saku |
+---------------+
| country |
| mhold |
| mount |
| rhold |
| river |
+---------------+

こんな感じで出てくる

⑤テーブル作る

create table sns (
id serial primary key,
name text,
title text,
message text not null,
date date not null,
password text
);

それからshow tables;で確認するとsnsが追加されているはず!

⑤テーブルの確認(詳細)

テーブルの詳細確認は、
describe テーブル名;
desc テーブル名;でも可能

+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| name | text | YES | | NULL | |
| title | text | YES | | NULL | |
| message | text | NO | | NULL | |
| date | date | NO | | NULL | |
| password | text | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
こんな感じ

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

docker ruby(2.6.5)・mysql(5.6.47)・rails(6.0.0)の開発環境構築

概要

dockerを開発環境に使ってアプリを作成しました。初めてdockerを使ってなかなかうまく動かなかったので動いたものをアウトプットを含めて共有します。また、deviseの導入も行って開発も少々行っていきたいと思います。

dockerの導入

ベースはdockerの公式サイトにRailsとPostgresSQLのdocker-composeの使い方が乗っていたのでそちらを参考にします。

dockerの公式サイト
https://docs.docker.com/compose/rails/

ただ、rails6.0.0からはwebpackerが標準になったことにより6.0.0を使う際には修正が必要です。また、今回はmysqlを使うのでそちらも変更していきます。

アプリのディレクトリ作成

ターミナル.
mkdir sampleapp

アプリのディレクトリに移動

ターミナル.
cd sampleapp 

dockerfileの生成

ターミナル.
touch dockerfile

dockerfileの編集

作成したdockerfileを以下のように編集します。

dockerfile.
FROM ruby:2.6.5

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

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn

RUN 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"]

公式の以下の点を修正しました。

1.rubyのバージョンを変更。
2.webpackerが標準になったことにより、必要になったyarnのインストールを行う。

FROM ruby:2.6.5

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

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn

entrypoint.shの生成

 touch entrypoint.sh

entrypoint.shの編集

作成したentrypoint.shを編集します。こちらはdockerの公式サイトの通りになります。

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

docker-compose.ymlの生成

touch docker-compose.yml

docker-compose.ymlの編集

生成したファイルを以下のように編集します。

docker-compose.yml
version: "3"
services:
  db:
    image: mysql:5.6.47
    environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: root
    ports:
        - "3306:3306"
    volumes:
        - ./db/mysql/volumes:/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'"
    stdin_open: true
    tty: true
    volumes:
      - .:/myapp
      - gem_data:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  mysql_data:
  gem_data:

公式のリファレンスではpostgresqlを使っているためmysqlにしています。

services:
db:
image: mysql:5.6.47
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./db/mysql/volumes:/var/lib/mysql

アプリ製作中にbinding.pryを使えるように以下を追加しています。

stdin_open: true
tty: true

データとgemを永続化するために以下の記述を追加しています。

volumes:
mysql_data:
gem_data:

Gemfileの生成

ターミナル.
touch Gemfile

生成したファイルを以下のように編集します。

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

空のGemfile.lockを生成

ターミナル.
touch Gemfile.lock

railsのプロジェクトを作成

ターミナル.
docker-compose run web rails new . --force -d mysql

docker-composeをbuildする

ターミナル.
docker-compose build

database.ymlの修正

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password 
  host: db

docker-composeの再起動

docker-composeを一旦downさせてバックグラウンドで起動するようにコマンドを入力

ターミナル.
docker-compose down
docker-compose up -d

データベースの作成

ターミナル.
docker-compose run web bundle exec rails db:create

ここまできたらlocalhost:3000/にアクセスしてみましょう。以下の画面が表示されるはずです。

スクリーンショット 2020-12-08 16.14.11.png

deviseを用いた簡単なアプリの開発

ここからはアプリ開発の入り口をやっていきます。

コントローラーとビューを生成

トップページを表示するためにposts(投稿)コントローラーとindexのビューを生成します

ターミナル.
docker-compose run web rails g controller posts index

生成したらルーティングを設定します。routes.rbを以下のように編集しましょう。

config/routes.rb
Rails.application.routes.draw do
  root 'posts#index'
  get 'posts/index'
end

この時点でlocalhost:3000/にアクセスすると以下のような画面になっています。
先ほど作成したpostsのindex(view)が表示されていることがわかります。

スクリーンショット 2020-12-08 16.19.20.png

deviseの導入

gemファイルの一番したにdeviseを記述します。

Gemfile.
gem 'devise'

bundle installを行う

dockerを利用している場合には通常行っているコマンドに "docker-compose run web"をつける必要があります。

ターミナル.
docker-compose run web bundle install

dockerの再起動

gemを新たに追加したためdocker-composeの再起動を行います。

ターミナル.
docker-compose down
docker-compose up -d

あとは通常のdeviseと同じ作業を行っていきます。
それぞれのコマンドを入力していきます。

ターミナル.
docker-compose run web rails g devise:install
docker-compose run web rails g devise user
docker-compose run web rails db:migrate
docker-compose run web rails g devise:views

ここまできたら再度dockerを再起動させます

ターミナル.
docker-compose down
docker-compose up -d

ここまででdeviseの導入全てが終わったためあとはposts/index.html.erbに以下を記述してみましょう。

posts/index.html.erb
<%=link_to "ログイン", new_user_session_path %>

ここまででlocalhost:3000/にアクセスするとログインボタンが表示され、押すとログイン画面に遷移します。
これでdockerを使ってdeviseを動かすところまで行えました。
ここからはそれぞれのオリジナルアプリの仕様に従って開発ができると思います。
トップページ
スクリーンショット 2020-12-08 16.30.45.png

ログインページ
スクリーンショット 2020-12-08 16.33.27.png

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

AWS EC2上にDockerコンテナ(Laravel, MySQL, nginx)を起動しアクセスする

環境

  • Mac
  • Docker
  • EC2 (Amazon Linux2, t2.micro)
  • nginx
  • Laravel
  • MySQL
  • Github

ゴール

EC2上でLaravelのページを表示する
スクリーンショット 2020-09-12 14.48.10.png

前提

  • 今回はお試しなのでEC2は無料利用枠を使えるAmazon Linux2, t2.micro選定
  • EC2のインスタンスならびにSSHの接続で使用するキーペアは作成済みとする。

EC2にログインする

xxx.pemにEC2を作成する際に作成したキーペアのファイルパス、(接続先にユーザー名)@(EC2のパブリックDNS)を指定する。
ユーザー名はデフォルトで「ec2user」、EC2のパブリックDNSはEC2の詳細画面で確認する。

mac
$ sudo ssh -i xxx.pem ec2user@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

dockerをインストールする

ec2
$ sudo yum install docker
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ docker.x86_64 0:19.03.6ce-4.amzn2  インストール
--> 依存性の処理をしています: runc >= 1.0.0 のパッケージ: docker-19.03.6ce-4.amzn2.x86_64
--> 依存性の処理をしています: containerd >= 1.3.2 のパッケージ: docker-19.03.6ce-4.amzn2.x86_64
--> 依存性の処理をしています: pigz のパッケージ: docker-19.03.6ce-4.amzn2.x86_64
--> 依存性の処理をしています: libcgroup のパッケージ: docker-19.03.6ce-4.amzn2.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ containerd.x86_64 0:1.3.2-1.amzn2  インストール
:

$ docker --version
Docker version 19.03.12, build 48a66213fe    <- インストールされたことを確認

docker-composeをインストールする

最新バージョンを公式サイトで確認しインストールする

ec2
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   651  100   651    0     0   2141      0 --:--:-- --:--:-- --:--:--  2134
100 11.6M  100 11.6M    0     0  3734k      0  0:00:03  0:00:03 --:--:-- 5900k

$ sudo chmod +x /usr/local/bin/docker-compose    <- 実行権限を与える
$ docker-compose --version
docker-compose version 1.27.0, build 980ec85b    <- インストールされたことを確認

gitインストール

ec2
$ sudo yum install git-all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                                           | 3.7 kB  00:00:00     
依存性の解決をしています
--> トランザクションの確認を実行しています

ローカル(Mac)で作成した環境を取り込む

今回はgithub上にあるリポジトリからクローンする

ec2
$ git clone https://github.com/xxx.git
Cloning into 'typing-app'...
Username for 'https://github.com': xxx    <- githubのユーザー名を入力
Password for 'https://narita-akk@github.com':     <- githubのパスワードを入力
remote: Enumerating objects: 133, done.
remote: Counting objects: 100% (133/133), done.

[ec2-user@ip-172-31-47-56 ~]$ ls    <- クローンされたことを確認
test-project

Dockerのデーモンを起動する

ec2
$ systemctl status docker.service    <- デーモンの状態を確認
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

$ sudo systemctl enable docker.service    <- デーモンを有効化する
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

$ systemctl status docker.service    <- デーモンが有効化されたことを確認
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

$ sudo systemctl start docker    <- デーモンを起動する

$ systemctl status docker    <- デーモンが起動されたことを確認
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since  2020-09-11 23:03:25 UTC; 5s ago
     Docs: https://docs.docker.com
  Process: 3651 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 3638 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 3659 (dockerd)
    Tasks: 8
   Memory: 118.4M
   CGroup: /system.slice/docker.service
           └─3659 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=1024:4096
:

Dockerコンテナを構築し起動する

ec2
$ docker-compose up -d --build
Creating network "typing-app_default" with the default driver
Creating volume "typing-app_db-store" with default driver
Building app
Step 1/7 : FROM php:7.4-fpm-buster
7.4-fpm-buster: Pulling from library/php
d121f8d1c412: Pull complete
:

$ docker ps    <- 起動されているコンテナを確認
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                   NAMES
734c90dda24a        nginx:1.19.2-alpine   "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes        0.0.0.0:10080->80/tcp   typing-app_web_1
0e545f085ec4        typing-app_app        "docker-php-entrypoi…"   2 minutes ago       Up 2 minutes        9000/tcp                typing-app_app_1
f860eb86350e        mysql:8.0             "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3306/tcp, 33060/tcp     typing-app_db_1

Laravelの初期設定をする

ec2
$ docker-compose exec app bash    <- Laravelがインストールされているコンテナに入る
ec2(app)
$ composer install    <- 必要なパッケージをインストール
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 106 installs, 0 updates, 0 removals
  - Installing doctrine/inflector (2.0.3): Downloading (100%)         
  - Installing doctrine/lexer (1.2.1): Downloading (100%)         
  - Installing dragonmantank/cron-expression (3.0.1): Downloading (100%)         
  - Installing voku/portable-ascii (1.5.3): Downloading (100%)         
:

$ ls -al    <- .env.exampleがあることを確認
total 304
drwxrwxr-x 12 1000 1000   4096 Sep 12 05:33 .
drwxr-xr-x  1 root root     33 Sep 12 05:33 ..
-rw-rw-r--  1 1000 1000    220 Sep 12 05:26 .editorconfig
-rw-rw-r--  1 1000 1000    784 Sep 12 05:26 .env.example
-rw-rw-r--  1 1000 1000    111 Sep 12 05:26 .gitattributes
:

$ cp .env.example .env    <- .env.example.envにコピー

$ php artisan key:generate    <- アプリケーションキーを作成
Application key set successfully.

root@3e98c590943b:/work# ls -al    <- storageの権限を確認
:
total 304
drwxrwxr-x  5 1000 1000     46 Sep 12 05:26 storage
:

$ cd bootstrap/
$ ls
app.php  cache
$ ls -al    <- bootstrap/cacheの権限を確認
total 8
drwxrwxr-x  2 1000 1000   64 Sep 12 05:34 cache
:

$ cd ..
$ chmod -R 777 storage    <- storageフォルダに書き込み権限を付与
$ chmod -R 777 bootstrap/cache/    <-bootstrap/cache/フォルダに書き込み権限を付与
:

ec2の80番ポートを開けてhttpアクセスを許可する

ec2のセキュリティグループを編集する

スクリーンショット 2020-09-12 15.08.51.png

ec2にブラウザからアクセス

スクリーンショット 2020-09-12 14.48.10.png

Laravelが表示できた!

参考サイト

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