20200921のMySQLに関する記事は8件です。

Rails 6 + MySQLの環境構築をDocker composeで作る

Dockerの公式サイトにはRailsアプリケーション用のDocker composeチュートリアルがあるが、少し情報が古くRails 6ではうまく動かなかったので、Rails 6で動かすための方法を載せておく。基本は公式チュートリアルの手順に従っているため、Rails 6用に変更したところを中心に補足を入れている。

DBはPostgresではなくMySQLを使う方法を載せておく。

プロジェクトディレクトリの準備

mkdir myrailsapp
cd myrailsapp

設定ファイルの準備

Dockerfile
FROM ruby:2.5

## nodejsとyarnはwebpackをインストールする際に必要
# yarnパッケージ管理ツールをインストール
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 && \
apt-get update && apt-get install -y yarn

RUN apt-get update -qq && apt-get install -y nodejs yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

Rails 6ではWebpackerの実行のためにyarnが必要になるのでDockerfileにyarnのインストールの手順を加える。ruby:2.5のイメージで普通にapt-get yarnでインストールすると0.32+gitという変なバージョンがインストールされてしまい後にエラーになるので、yarn公式サイトの指示にしたがってレポジトリを追加した後でapt-get install yarnする。

参考: https://qiita.com/shunichi_com/items/4dca141d8b9342c51a04

postgresは使用しないため除外。

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

GemfileでRails 6系を指定。このGemfileはRailsプロジェクト作成後にRailsプロジェクトの内容で上書きされることになる。

touch Gemfile.lock
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
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/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

MySQLを使う形に設定を変更。

Railsプロジェクトの作成

docker-compose run web rails new . --force --no-deps --database=mysql

--database=mysqlでDB設定をMySQLにした状態でプロジェクト作成。

docker-compose build

DB接続設定

database.yml
development:
  <<: *default
  database: myapp_development
  host: db
  username: root
  password: password

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: myapp_test
  host: db
  username: root
  password: password

developmenttestがdocker-composeで起動したMySQLイメージdbを使うように設定を記述。

DB作成

docker-compose run web rails db:create

Webpackerの導入

docker-compose run web rails webpacker:install 

Rails 6からSprocketsに代わりWebpackerが使われるようになったためこのステップが必要に。

イメージの起動

docker-compose up

Scaffold

docker-compose run web rails g scaffold article title:string body:text published_at:timestamp
docker-compose run web rails db:migrate

docker-composeを使って開発をする場合は、scaffold含めgenerate系のコマンド、マイグレーションもdocker-compose run webで実行する。

docker-compose up

スクリーンショット 2020-09-22 0.07.07.png

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

Linux上でPython3でMySQLへアクセスするためのyumコマンド

実行

mysqlclient使わなければ不要かも。

# とりあえず
yum update -y
# /usr/include 配下に実行したいpythonのディレクトリが出来ること
# 例:/usr/include/python3.7

yum install -y python3-devel
# /lib64/mysql/libmysqlclient.so.18 が入る

yum install -y gcc mysql-devel mysql-libs
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者チームがWebサービス開発を始めて4週間で出来たことと出来なかったこと

2週間前にアップした「初学者チームがWebサービス開発を始めて最初の2週間でやったことを振り返り、そして次を考える」という記事から、また2週間経ったので、どこまで進捗したのかまとめたいと思います。

「初心者だけど何かモノを作ってみたい!」という方の参考になれば幸いです。

目標達成度

2週間前掲げていた目標と、実際できたことを整理します。
こちらが2週間前の記事では言っていたこと。

というわけで、次なる目標ですが、深い意味は特になく、なんとなくまた2週間先(9/21月曜)にチェックポイントを置きたいと思います。
目標は、9/21Monまでに人にURLをばら撒けるレベルのサイトにしたい!です。
具体的には、下記8点の要件を満たしたいです。

その8点と結果がこちら。

2週間前掲げた目標 達成度 10点満点 コメント
Heroku上でアプリが機能する 8 2週間前はHerokuにデプロイしたてでエラーもしばしば。今は表示は安定、基本動作も問題なし。
ページ内のリンクなど、ページがきちんと遷移する 5 まだ作れてないページがあったり、戻るボタン、キャンセルボタンなどが欠けています。
シンプルだが見るに耐えうるデザインであり全ページに統一感がある 3 フロントチームは頑張って作ってくれたのですが、サーバーサイドがそこまで手が回りませんでした。
投稿が新着順で表示でき、1ページの投稿は10件まで、それ以上は別ページとする 9 今ではペジネーションという専門用語も覚えました!でもデザイン配置のカスタマイズができてないので-1。
投稿がキーワード検索できる 0 全く手をつけてませんでした涙
アカウント登録した人がログイン、ログアウト、投稿、削除、編集できる 9 Laravelデフォルトのユーザ認証機能も利用しつつ、自分らのデザインを当て込むこともできてきました。
ゲストでも投稿できる 10 できました。
Contactページから問い合わせすると運営にメールが届く 5 今日滑り込みでメールを受信するまでの基礎機能の実装はできました。
総合得点 49/80 達成度61%

60点ならまずまずではないでしょうか!ただ、残念ながらまだ胸を張ってURLを配れるようなレベルはなりませんでした。
そして、ストレッチで掲げていた目標は綺麗に一切手を付けられませんでした(笑)↓

ストレッチ目標 達成度 10点満点 コメント
アカウントがアイコン画像を設定できる 0
投稿に画像を1枚添付できる 0
ミュージシャンごとの投稿を集約したページが生成できる 0
ライブハウスごとの投稿を集約したページが生成できる 0
いいね!ができる 0
利用規約のページがある 0
管理人が不適切な投稿を削除できる 0
総合得点 0/70 達成度0%

その他にこの2週間でできたこと箇条書き↓

感想3つ

(そういうのいいよって方は飛ばしてください)

初心者なのにモノを作ってみた感想

人それぞれ勉強方法はあるのかもしれませんが、基礎から教科書をやっていくという勉強方法よりも、実際にモノを作るというこの方法が僕には一番合っていると感じています。めっちゃくちゃ夢中になっています。ただし!1ページめくれば、次の手順を教えてくれるテキスト学習と違って、1歩進むごとに、何をしたらいいのかわからない、どう調べればいいかもわからない、手をつけたらエラーになるの繰り返しです。

上手くいかない時は、焦るし、焦って変なコマンド打ってしまったり、イライラしたり、精神的に安定しないこともありました。一般人は「プログラミングは超絶簡単」「1ヶ月でできるようになる」という有名人の言葉を鵜呑みにしない方がいいです。でも何かちょっと対策を講じてエラー文章が変わり、それで推理が進んで、原因を突き止めて、前に進んだ時の喜びと快感は尋常じゃなかったりします。

仲間という存在の貴重さ

まこなり社長さんが「プログラミング学習には仲間を作った方がいい」と仰っているのを聞いたことがありますが、僕も同意です。あれは単なるテックキャンプへ誘導する文言ではないと思います(笑)僕の理由は「行き詰まった時、話せる相手がいるのは超助かるから」です。相談する相手も初学者なので、答えがもらえるとは限らないのですが、一緒に調べてくれたり、解決のヒントを与えてくれたりします。自分の思考がクリアになって、話してるうちに閃くということも経験しました。そして何より精神的に落ち着けます。こういうことで悩んでるんだよねーというと、「わかるーー!」と言ってもらえるだけでなんか落ち着けるんですよね。女子の気持ちが少しわかりました(笑)

ただし、初心者のチーム開発はハッキリ言って楽ではありません。でもその大変さを差し引いてもプラスになっていると思います。

あと先輩やメンターの存在も結構大きいです。それらが揃ってるYouTube万屋エンジニアチャンネル超おすすめっす!

開発初期にはプログラミング以外の時間が結構かかる

最初の3週間はアプリの企画、設計を考えたり、開発環境を整えたりで手一杯で、コードを書く状態に至りませんでした。(フロントチームはその間HTML/CSSでサイトの見た目を作ってくれていました)ようやく4週間めくらいからプログラムを書けるようになってきて、やっぱりコーディングの方が楽しいなと思いました。

今後の開発

次の目標

期限:10/5月曜18:00
下記10点の実装を目指します。

  • 継承レイアウトで構築し、サイト全体にデザインの統一感がある
  • 投稿の文章が長い場合、全文表示/一部表示の切り替えができる
  • ドロップダウンメニュー
  • 投稿の際、チップスの効いたタグ付けができる
  • 投稿に付いたタグをクリックするとそのタグの投稿一覧を表示できる
  • 登録ユーザーの投稿一覧が表示できる
  • 検索機能
  • いいね機能の実装
  • Contactから運営側にメールが届き、問い合わせ内容がわかる
  • ユーザーがプロフ画像を設定できる

開発体制の変更

今まではフロントには一旦別環境でHTML/CSS作りに集中してもらっていたのですが、開発が進んできてそれでは大変になってきそうなので、フロントチームもLaravelを入れてもらってバックエンドと同じ環境下でフロントのブラッシュアップをしてもらうつもりです。

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

MAMPでmysqlパスワード無しにする方法

mysqlにログインし、パスワードを変更します。

mysql -u root -p
# mysqlにログイン

SET PASSWORD = password('新しいパスワード');
# '新しいパスワード'を設定

この状態では、phpMyAdminからログインできないため、config.inc.phpにそのための設定を追加します。

mdfind "config.inc.php" | grep "bin/phpMyAdmin/config.inc.php" | xargs code
# config.inc.phpの場所を検索して開く

config.inc.phpを'password'で検索すると次のような設定項目が見つかると思います。
パスワード無しを許可する行を追記してください。

$cfg['Servers'][$i]['auth_type']     = 'config';    // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user']          = 'root';      // MySQL user
$cfg['Servers'][$i]['password']      = '';          // MySQL password (only needed
$cfg['Servers'][$i]['AllowNoPassword'] = true;      // パスワード無しを許可

これで設定は完了です。MAMP → OpenWebSitePage → Tools → phpMyAdminで、
データベースにアクセスできます。

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

Heroku(Laravel)で自作アプリをHerokuにデプロイしようとしたらマイグレーションエラーが起きたので、ClearDB(MySQL5.5)からJawsDB(MySQL8.0)に変更した時の備忘録

開発環境

PHP7.3
Laravel5.8
MySQL8.0
Heroku使用時のDBアドオン:ClearDB MySQL5.5

やろうとしたこと

下記をheroku run php artisan migrate

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Facades\Schema;

class CreateChatRoomsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('chat_rooms', function (Blueprint $table) {
            $table->id();
            $table->text('user_info_json')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('chat_rooms');
    }
}

エラーが出現。

エラーの内容

  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(JSON_ARRAY()),   
  `created_at` timestamp null, `updated_at` timestamp null) defaul' at line 1 (SQL: create table `chat_rooms` (`id` bigint unsigned not null auto_increment primary key, `user_info_json` text not null default (  
  JSON_ARRAY()), `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')                                                                                                                                                                                                                                                                                             
  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(JSON_ARRAY()),   
  `created_at` timestamp null, `updated_at` timestamp null) defaul' at line 1

推測

$table->text('user_info_json')->default(new Expression('(JSON_ARRAY())'));

の部分がSQLのバージョンに対応していないらしい。

ローカル(MySQL8.0)ではエラーは起こらなかったため、本番環境のSQLをバージョンアップすれば通るかも?

ClearDBからJawsDBにアドオンを変更しよう

ClearDB・・・MySQL5.5、5.6、5.7対応
JawsDB・・・5.7及び8.0対応
とのことであったため、ローカル環境(MySQL8.0)と合わせるべくJawsDBにアドオンを変更することに。

JawsDBアドオン取得

heroku addons:create jawsdb:[プラン名] -a [アプリ名] --version=8.0

--version=8.0のようにすることで、バージョンを8.0指定でインストール。

ClearDBの環境変数を削除

JawsDBをインストールしただけの状態なので、まだClearDB使用時の環境変数が登録されている。

DB_DATABASE:           [ClearDBのDATABASE]
DB_HOST:               [ClearDBのHOST]
DB_PASSWORD:           [ClearDBのPASSWORD]
DB_USERNAME:           [ClearDBのUSERNAME]

これらを全て一旦削除

heroku config:unset DB_DATABASE
heroku config:unset DB_HOST
heroku config:unset DB_PASSWORD
heroku config:unset DB_USERNAME

その後

heroku config

すると、ClearDBの環境変数が消えている。

JawsDBの接続情報を確認

heroku config |grep JAWSDB_URL
JAWSDB_URL:       mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]

もしくはHerokuのマイページからJawsDBアドオンに遷移して確認。

JawsDBの環境変数登録

heroku config:set DB_DATABASE=[DB_DATABASE]
heroku config:set DB_HOST=[DB_HOST]
heroku config:set DB_PASSWORD=[DB_PASSWORD]
heroku config:set DB_USERNAME=[DB_USERNAME]

再度マイグレーション

heroku run php artisan migrate

通った!

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

MYSQL ランダムデータ生成

日付

UPDATE `inquiry`  SET `regist_date` = concat(date_format(date_add(date('2016-09-21'), interval (rand() * 365 * 4) day), '%Y-%m-%d'), ' ', cast(time(sec_to_time(ceil((rand() * 86400)))) as char));

例)2016-09-21から4年分

UPDATE user_data SET image_path=REPLACE(image_path, "/img/", "/") WHERE id=8;

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

SQL(MySQL)入門! INSERT, UPDATE, DELETE, TRUNCATE 編

環境

 Windows 10
 MySQL : version(5.7.28)
使用アプリ
 コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)


INSERT

指定したカラムのデータを登録する

INSERT
INTO
    TABLE1  -- テーブル名
(
    COLUMN1 -- カラム1
,   COLUMN2 -- カラム2
,   COLUMN3 -- カラム3
) VALUES (
    VALUE1  -- カラム1に挿入する値
,   VALUE2  -- カラム2に挿入する値
,   VALUE3  -- カラム3に挿入する値
)

カラム名を省略して書けるが、カラムの並び順通りにすべての値を力しないとエラーとなる

INSERT
INTO
    TABLE1 -- テーブル名
VALUES(
    VALUE1 -- カラム1に挿入する値
,   VALUE2 -- カラム2に挿入する値
,   VALUE3 -- カラム3に挿入する値
)

UPDATE

レコードを更新する(,で繋ぐことで複数入力も可能)

UPDATE 
    TABLE1    -- テーブル名
SET
    COLUMN2   =   VALUE -- カラム2に新たに値を挿入
WHERE
    COLUMN1   =   VALUE 更新したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定

DELETE

レコードの削除

DELETE
FROM
    TABLE1  -- テーブル名
WHERE
    COLUMN  =    VALUE -- 削除したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定

TRUNCATE

テーブル内の全データ削除(強制的にデータが消えるので使用する際には注意が必要です)

TRUNCATE テーブル名

一旦テーブルを削除して、またテーブルを作成

TRUNCATE TABLE テーブル名

終わりに

フューチャー株式会社が作成するSQLコーディング規約(Oracle)に則った形で書いています。

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

Access denied for user 'root'@'localhost' (using password: YES)のエラー

状況

Ruby on Rails 6.0.3.2
EC2へのデプロイ作業中のエラー
MySQLへのログインはできるので正しいパスワードは把握できている。

DBの作成時にエラーが出る

本番環境で以下のコマンドでDB作成を試みる。

rails db:create RAILS_ENV=production

しかし以下のようなエラーが発生。

rails aborted!
Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: YES)
/var/www/<アプリ名>/bin/rails:9:in `<top (required)>'
/var/www/<アプリ名>/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

何が問題なのか

MySQLへ接続時のパスワードが間違っている。

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

上記の文の意味はパスワードは入力されているがパスワードが間違っているという意味である。

解決方法

環境変数の設定が間違っている可能性がある。
特にenvironmentファイルに記入した環境変数とパスワードを囲むシングルクォートが全角だとエラーになる。(シングルクォートを含んだパスワードと見なされるため)
環境変数とパスワードを表示するコマンドを入力した時、パスワードと環境変数がシングルクォートで囲まれているかどうかで確認できる(半角だとシングルクォートが出ない)。

まとめ

タイトルのようなエラー文が表示された時はパスワードが間違っているので要確認。
 

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