20220109のMySQLに関する記事は7件です。

【Docker】初期データが入ったMySQLコンテナでSQLの練習環境を作る

はじめに Dockerのインストールについては省略します。 初期データはMySQLのWorldを使用しています。 さまざまな国や都市、言語についてのデータで、眺めるだけでも面白いです。 こちらからダウンロード可能です。 ディレクトリ構成は以下の形です。 root ├── mysql │ └── db │ ├── world.sql │ └── my.cnf └── docker-compose.yml docker-compose docker-compose.ymlは以下のように記述します。 docker-compose.yml version: "3" services: mysql: volumes: # これにより./mysql/dbにある.sqlファイルを実行してくれます - ./mysql/db:/docker-entrypoint-initdb.d image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root container_name: mysql コンテナを立ち上げる コンテナを立ち上げ、作成されたコンテナ内でMySQLに接続します。 $ docker-compose up -d # -dオプションによって、コンテナを立ち上げながらコマンドを入力できます。 $ docker exec -it mysql /bin/bash root@xxxxx:/# mysql -p Enter password: root mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.01 sec) データベースにworldが確認できれば成功です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mySqlではtimestampにNullを入れられない

初投稿になります。 Udemyのこちらの講座で一通り勉強したので、仕事であったら便利そうなWebアプリを作ってみようと思っています。 プログラミングの勉強を始めたきっかけはいつか別記事で書きたいと思っています。 つくろうとしている物 弊社には顧客管理や見積請求作成ソフトがありデータがリンクするようになっているのですが、リース器具管理だけ独立してexcelデータで、そこの管理を任されているので業務効率化とプログラミングの勉強を兼ねてリース管理アプリを作成しようと思いました。 躓いたところ リース商品は契約開始日や更新日、解約日など日付を入力する部分がたくさんあります。 講座を写径しながら、自分で作りたいものに作り替えいくとエラーにぶち当たりました。 エラーに慣れていなくてまったく読みもせずに、どこを写し間違えたかと見直し→書き直し→migrateをループしていました。ある程度したらエラーアレルギーも収まり、ちょっとずつ読めるようになりました。(これとっても不思議!)記事にするつもりはなかったのでエラー文は残してないのですが、テーブル名とデータの型名、NOT NULL ABLEが読み取れてTIMESTAMP型にNullは入れられないことに気づきました。 TIMESTAMPにNULLが入れられないということはMySqlでググれば解決策見つかりそうと判断。ついでにphpで書いていると思ったので(今現在も何の言語を書いているかよくわかっていない)「TIMESTAMP PHP NULL ABLE」で検索してもズバリな記事は見つからず途方に暮れてしまいました。 ->nullable()で解決 一人で気ままに学習するいいところとして、好きな時に切り上げられる点だと思います。 息抜きに散歩していると「laravelで検索したらわかるんじゃね?」と関係ある要素を考えれば至極当たり前なことに気づき、わくわくしながらググるとサクッと答えが出てきました!といっても日本語の情報ではなくEnglishだったので記事にさせていただきました。 $table->timestamp('カラム名')->nullable(); このように書くことによりNullを許可したTIMESTAMP型でカラムを作ることができます。 あとがき なぜ、TIMESTAMPにNullが許可されていないのか。 MySqlのTIMESTAMP型には2038年問題があるかららしいです。 Nullを許可する情報が少なかったのはこのせいなのかもしれません。 せっかく解決策が分かったけど、DATETIME型で作り直そうかなw プログラミングもマークダウンもブログを書くことも初心者なのでこうしたほうがいいとか、間違っている点などあればご指摘お願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js: MySQL 8.0 で接続エラーが出た時の対策

次のエラーが出た時の対策です。 code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true エラーが出るプログラム maria_version.js #! /usr/local/bin/node // --------------------------------------------------------------- // maria_version.js // // Jan/09/2022 // // --------------------------------------------------------------- 'use strict' // --------------------------------------------------------------- console.error ("*** 開始 ***") var mysql = require('mysql') // var mysql = require('mysql2') var connection = mysql.createConnection ({ host: 'localhost', user: 'scott', password: 'tiger123' }) connection.query("select version()", function (err, rows) { if (err) throw err console.log (rows.length) console.log (rows[0]) connection.end() console.error ("*** 終了 ***") }) 解決方法 require('mysql') を require('mysql2') にすれば、問題は解決します。 実行結果 *** 開始 *** 1 { 'version()': '8.0.27-0ubuntu0.20.04.1' } *** 終了 *** MySQL サーバーで対処することもできます。 mysql> ALTER USER scott@localhost IDENTIFIED WITH mysql_native_password BY 'tige r123';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: Name or service not known (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')

Dockerで環境構築していた際につまづいたので、メモりました。 ご参考になれば幸いです。 概要 下記記事を参照してLaravel+React+MySQLの環境をDockerで作成しようとしたところ エラーが発生しました。 エラー内容 タイトルにある通り、以下のエラーが発生しました。 tarminal SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: Name or service not known (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE') DB(MySQL)への接続が上手くいっていないらしい... 調査結果 コンテナの起動確認 tarminal $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 737e1499b7c0 9df10d5fd4e9 "/entrypoint.sh mysq…" About a minute ago Exited (1) About a minute ago docker-laravel_db_1 d11753ef631f f5bc33c1bffa "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp docker-laravel_web_1 1055b9270a37 198704a55e0c "docker-php-entrypoi…" 6 minutes ago Up 6 minutes 9000/tcp docker-laravel_app_1 dbコンテナだけSTATUSが「Exited」のままで起動していない ログ確認 tarminal $ docker logs <コンテナID> [Entrypoint] MySQL Docker Image 8.0.27-1.2.6-server [Entrypoint] Starting MySQL 8.0.27-1.2.6-server 2022-01-09T05:11:30.261390-00:00 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1 2022-01-09T05:11:30.264356-00:00 0 [ERROR] [MY-013276] [Server] Failed to set datadir to '/var/lib/mysql/' (OS errno: 13 - Permission denied) 2022-01-09T05:11:30.264532-00:00 0 [ERROR] [MY-010119] [Server] Aborting 2022-01-09T05:11:30.264761-00:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27) MySQL Community Server - GPL. [Entrypoint] MySQL Docker Image 8.0.27-1.2.6-server [Entrypoint] Starting MySQL 8.0.27-1.2.6-server 2022-01-09T05:11:44.674545-00:00 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1 2022-01-09T05:11:44.677153-00:00 0 [ERROR] [MY-013276] [Server] Failed to set datadir to '/var/lib/mysql/' (OS errno: 13 - Permission denied) 2022-01-09T05:11:44.677246-00:00 0 [ERROR] [MY-010119] [Server] Aborting 2022-01-09T05:11:44.677499-00:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27) MySQL Community Server - GPL. /var/lib/mysqlにデータを永続化したかったけど、マウントするところでアクセス権限がないよって怒られてますね。 解決策 ググったところ、下記記事が参考になりました。 この記事の中に下記の文言が記載されている つまり、マウントしたディレクトリに書き込めるのは、root か uid=1000 のユーザだけである。 my.cnfに記載されている動作ユーザの権限が「mysql」になっていたので、権限を「root」に変更してビルドしたところ無事解決!! tarminal Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (65.04ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (43.12ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (40.74ms) Migrating: 2019_12_14_000001_create_personal_access_tokens_table Migrated: 2019_12_14_000001_create_personal_access_tokens_table (68.47ms)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Heroku + MySQL + Rails6.0でstaging環境を用意する。

背景 個人アプリを開発していて、現状はローカル環境と本番環境しか用意していなかった。 本来であればstaging環境で確認後、本番環境にデプロイする流れが望ましいため、staging環境を準備することにした。 前提 Herokuで本番環境が用意できている。 手順 staging環境の作成 heroku create --remote staging これでstaging環境が作成される。 参考記事 本番環境の環境変数をインポート + stagingの環境変数にセットする。 heroku config -s -a "本番環境のアプリ名" > envvars.txt cat envvars.txt | tr '\n' ' ' | xargs heroku config:set -a "staging環境のアプリ名" CLEARDB_DATABASE_URL、DATABASE_URL、DB_NAME、DB_USERNAME、DB_PASSWORD、DB_HOSTNAMEもコピーしてしまっているが、そちらは削除しておく。 参考記事 cat envvars.txt | tr '\n' ' ' | xargsの解説 cat envvars.txtでインポートした本番環境の環境変数のファイルを出力する。 tr '\n' ' 'でennvars.txtの改行部分を空白に置換する。 xargsコマンドでcat envvars.txt | tr '\n' ' 'の結果を受け取って、次のコマンドの引数に渡してくれる。 参考記事 MySQLアドオンを追加する。 + stagingの環境変数の修正 heroku addons:create cleardb:ignite --remote staging CLEARDB_DATABASE_URLから、 DATABASE_URL、DB_NAME、DB_USERNAME、DB_PASSWORD、DB_HOSTNAMEの環境変数をセットする。 例: heroku config:set DB_NAME=xxxx --remote staging RAILS_ENVとRACK_ENVをstagingに変更する。 heroku config:add RACK_ENV=staging --remote staging heroku config:add RAILS_ENV=staging --remote staging staging.rbを用意する。 cp config/environments/production.rb config/environments/staging.rb staging.rb # 下記のように修正 config.action_mailer.default_url_options = { protocol: 'https', host: 'stagingのアプリ名' } staging環境にデプロイする。 git push staging master staging環境のDBを作成する。 heroku run rake db:migrate --remote staging staging環境のアプリ名を変更する。 heroku apps:rename "変更したいアプリ名" --remote staging 参考記事 以上で完了。 最後に 今回は取り急ぎstaging環境を用意することだけを行ったが、今後は プルリクを出したら自動的にstaging環境にデプロイされるようにする。 本番環境のデータと1日おきに同期する。 などといったことにも挑戦していきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel,MySQL】設定ファイル.env、.env.example、database.phpの違いとは?

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はLaravelでDBを利用する際の設定ファイルについてまとめます。 なお、PHPフレームワークLaravel入門 第2版ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。 設定ファイルはどれを使えばいいのか? LaravelにはDBを利用する際に使用する、設定に関するファイルが複数あります。 しかし、結局どれを使えばいいのか迷ったので調べてみました。 .envファイル このファイルには環境変数が定義されています。 DBに関する設定はデフォルトで以下の通りです。 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=[プロジェクト名] DB_USERNAME=sail DB_PASSWORD=password 基本的に設定を変更するにはここを書き換えるといいようです。 後述のdatabase.phpでは、env()関数を使用して.envファイルで設定された環境変数を取得しています。 また、以下の通り.envファイルをGitHub等で管理してはいけません。 アプリケーションを使用する開発者/サーバごとに異なる環境設定が必要になる可能性があるため、.envファイルをアプリケーションのソース管理にコミットしないでください。さらに、機密性の高い資格情報が公開されるため、侵入者がソース管理リポジトリにアクセスした場合のセキュリティリスクになります。 Laravel 8.x 設定 ちなみに、デフォルトで.gitignoreファイル内でGitのソース管理対象から外すよう設定されています。 #.gitignoreファイル /node_modules /public/hot /public/storage /storage/*.key /vendor .env ##########ここに設定されている .env.backup .phpunit.result.cache docker-compose.override.yml Homestead.json Homestead.yaml npm-debug.log yarn-error.log /.idea /.vscode では、.envの設定項目や設定値をチーム内で共有したい場合はどうすれば良いのか? .env.exampleファイルを利用しましょう。 .env.exampleファイル このファイルに、共有したい設定を記載します。 ただし、本番環境で使用するような設定は記載すべきではないでしょう。 デフォルトでは以下のような設定値になっています。 DB_HOSTやDB_DATABASEの設定項目が.envと異なります。 自分自身を指すIPアドレスである、127.0.0.1が設定されるなど仮に外部に漏れても危険ではない値が設定されているようです。 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= チームで開発している場合は、アプリケーションに.env.exampleファイルを含め続けることをお勧めします。サンプル設定ファイルにプレースホルダー値を配置することにより、チームの他の開発者は、アプリケーションを実行するために必要な環境変数を明確に確認できます。 Laravel 8.x 設定 database.phpファイル こちらがDBの設定ファイルです。 デフォルトでは、ほとんどの項目でenv('.envの設定項目名', 'デフォルト値')関数を用いて環境変数を取得しています。 したがって、.envの内容を書き換えるとenv()関数で取得される値も変わります。 database.php //MySQLの設定のみ抜粋 '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'), ]) : [], Laravelのデータベースサービスの設定は、アプリケーションのconfig/database.php設定ファイルにあります。このファイルは、全データベース接続を定義し、デフォルトで使用する接続を指定できます。このファイル内のほとんどの設定オプションは、アプリケーションの環境変数の値によって決まります。Laravelがサポートしているデータベースシステムのほとんどの設定例をこのファイルに用意しています。 Laravel 8.x データベース:準備 まとめ .env 環境変数を定義する。env()関数を使用するとこのファイルの設定値を取得できる。 また、セキュリティリスクとなるため.envファイルをGitHub等で管理してはいけない。 .env.example チーム開発時に、アプリケーションを実行するために必要な環境変数を共有するために使用。 database.php DBの設定ファイル。 デフォルトでは多くの項目で、env()関数を使用して.envファイルから環境変数を取得している。 参考文献 PHPフレームワークLaravel入門 第2版 Laravel 8.x 設定 Laravel 8.x データベース:準備
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mac環境にmysqlをインストールしてみよう

初めに、ターミナルを開きます。 Homebrewをインストールする 「Homebrew」を用いて「MySQL」をインストールしていきます。 その前に、以下のコマンドで「Homebrew」のバージョンを確認します。 % brew -v Homebrew 3.2.15みたいな感じでバージンが出てきたら、インストールができています。 もし、インストール出来ていない場合は以下のコマンドを実行し、インストールしてください。 % /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"    MySQLのインストール 初めに、以下のコマンドでmysqlがインストールされているか確認しましょう。 mysql --version zsh: command not found: mysqlみたいなコマンドが出てきたら、mysqlがインストールされていないので、インストールしていきましょう。    インストールは以下のコマンドで実行できます。 % brew install mysql    インストールが完了したら、以下のコマンドでインストールしたMySQLの情報を確認できます。 % brew info mysql または、mysql --versionでバージョンを確認することができたら、インストールが完了しています。    MySQLを立ち上げてみる 以下のコマンドでmysqlを起動してみましょう。以下の結果が出てきたら、起動に成功しています。 % mysql.server start Starting MySQL . SUCCESS! mysqlにログイン 次にmysqlにログインしてみましょう。ログインは以下のコマンドでできます。 % mysql -uroot MySQLの入力モードを終了 MySQLの入力モードを終了したい場合は、exitと入力したら終了できます。    MySQLを停止してみよう MySQLはメモリの使用量も多く、利用していない時にはデータベースを停止しておいた方が良いです。 MySQLを停止するコマンドは以下の通りとなります。 % mysql.server stop 参考にした記事 今回は以下の記事を参考にさせていただきました。 Mac環境にMySQLをインストールしてみよう MySQLの開発環境を用意しよう(Mac)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む