- 投稿日:2021-02-20T22:02:42+09:00
低コストでSQLを勉強する方法【Docker+GUI Toool】
macOS前提の記述ですが、他OSでもある程度対応できるはずです。
Step1 Dockerを入れる
Dockerを入れる。
Step1-2 Dockerの操作を補助するツールを入れる(任意)
Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。Step2 genschsa/mysql-employeesをpullする
Docker Hubkからgenschsa/mysql-employeesを入れる。docker pull genschsa/mysql-employeesでイメージを持ってきて
docker run -d \ --name mysql-employees \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=college \ -v $PWD/data:/var/lib/mysql \ genschsa/mysql-employeesで動かせる
Step3-1 DB GUIアプリを入れる
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。本記事でGUIツールでの利用を
Step3-2 GUIアプリで接続する
docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。
設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。
あとはSelect Databaseにemployeesを設定して中身を確認し、
データを追加したり
消したり
あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!本記事を書いたきっかけ
ええっ!?30万件近いデータの入ったemployeesデータベースがDocker imageとして公開されているのかい!?
— dowanna @PrAha Inc. CEO兼エンジニア (@dowanna6) January 26, 2021
クエリやインデックスやパフォーマンスチューニングの練習に使える最高の環境がdocker runするだけで手に入るのかい!?
すごいねマスオくぅん!https://t.co/Q8jKGs2I3F
を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。
- 投稿日:2021-02-20T22:02:42+09:00
低コストでSQLを勉強する方法【Employees Sample Database+Docker+GUI Toool】
macOS前提の記述ですが、他OSでもある程度対応できるはずです。
Step1 Dockerを入れる
Dockerを入れる。
Step1-2 Dockerの操作を補助するツールを入れる(任意)
Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。Step2 genschsa/mysql-employeesをpullする
Docker Hubkからgenschsa/mysql-employeesを入れる。docker pull genschsa/mysql-employeesでイメージを持ってきて
docker run -d \ --name mysql-employees \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=college \ -v $PWD/data:/var/lib/mysql \ genschsa/mysql-employeesで動かせる
Step3-1 DB GUIアプリを入れる
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。本記事でGUIツールでの利用を
Step3-2 GUIアプリで接続する
docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。
設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。
あとはSelect Databaseにemployeesを設定して中身を確認し、
データを追加したり
消したり
あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!本記事を書いたきっかけ
ええっ!?30万件近いデータの入ったemployeesデータベースがDocker imageとして公開されているのかい!?
— dowanna @PrAha Inc. CEO兼エンジニア (@dowanna6) January 26, 2021
クエリやインデックスやパフォーマンスチューニングの練習に使える最高の環境がdocker runするだけで手に入るのかい!?
すごいねマスオくぅん!https://t.co/Q8jKGs2I3F
を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。
- 投稿日:2021-02-20T18:28:48+09:00
ローカルから直接Dockerのデータベースをバックアップ・レストアする
経緯
バックアップ・レストア方法をググるとほとんどの記事は
docker cp
してDockerコンテナの中に入って直接コマンド叩いてたり、docker run
でバックアップ、レストアのコマンドを実行していたりしている記事が多かったのですが、そうではなくてワンライナーで直接バックアップ、レストアする方法が知りたかったのでまとめてみました。基本的なバックアップ・レストア方法を記載します。もしパスワードやデータベース名が必要な場合は適宜コマンドのオプションで指定してください。
今回はPostgreSQL、MySQL、MongoDBについてまとめますが、その他のDBでも同様の方法で可能だと思います。
定数
以下の定数はコマンド等で確認してください。
CONTAINER_NAME
: Dockerのコンテナ名またはID。docker ps
で確認する。
USERNAME
: Docker内のデータベースのユーザ名
PASSWORD
: Docker内のデータベースのパスワード
DATABASE_NAME
: Docker内のデータベース名
SERVICE_NAME
: docker-composeのyamlに記載しているサービス名。docker-compose config --service
で確認する。PostgreSQL
Dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME pg_dumpall -U USERNAME > dump.sqlgzipで圧縮する場合は以下
docker exec CONTAINER_NAME pg_dumpall -U USERNAME | gzip > dump.sql.gzレストア
cat dump.sql | docker exec -i CONTAINER_NAME psql -U USERNAMEgzipで圧縮されたファイルをレストアする場合は以下
gunzip < dump.sql.gz | docker exec -i CONTAINER_NAME psql -U USERNAMEdocker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME pg_dumpall -U USERNAME > dump.sqlレストア
cat dump.sql | docker-compose exec -T SERVICE_NAME psql -U USERNAMEMySQL
Dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME > dump.sqlgzipで圧縮する場合は以下
docker exec CONTAINER_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME | gzip > dump.sql.gzレストア
cat dump.sql | docker exec -it CONTAINER_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAMEgzipで圧縮されたファイルをレストアする場合は以下
gunzip < dump.sql.gz | docker exec -i CONTAINER_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAMEdocker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME mysqldump -u USERNAME -pPASSWORD DATABASE_NAME > dump.sqlレストア
cat dump.sql | docker-compose exec -T SERVICE_NAME mysql -u USER_NAME -pPASSWORD DATABASE_NAMEMongoDB
dockerコマンドを使用する場合
バックアップ
docker exec CONTAINER_NAME mongodump --archive > db.dumpgzipで圧縮する場合は以下
docker exec CONTAINER_NAME mongodump --archive --gzip > db.dump.gzレストア
docker exec -i <mongodb container id or name> mongorestore --archive < db.dumpgzipで圧縮されたファイルをレストアする場合は以下
docker exec -i CONTAINER_NAME mongorestore --archive --gzip < db.dump.gzdocker-compose コマンドを使用する場合
バックアップ
docker-compose exec -T SERVICE_NAME mongodump --archive > db.dumpレストア
docker-compose exec -T SERVICE_NAME mongorestore --archive < db.dump参考資料
- ローカルから直接Dockerのデータベースを操作する - Qiita, Online; accessed 20–Feb–2021.
- How to restore a PostgreSQL database using Docker, Online; accessed 20–Feb–2021.
- ? mongodump and mongorestore with Docker - DEV Community, Online; accessed 20–Feb–2021.
- 投稿日:2021-02-20T13:36:31+09:00
PDOを使ってMySQLに接続する記述(個人用メモ)
はじめに
プログラミング初学者です。
Qiitaに挑戦ということで、初投稿になります。
今回は個人用メモの投稿です。
わかりにくいとは思いますが、
これからどんどん投稿してQiitaに慣れていき、
皆さんのお役に少しでも立てればなぁという所存です。PDOとは?
PHP Data Objectの略。
標準のデータベース接続クラスのこと。
なぜPDOを使うのか?
データベース操作はシステムごとに命令が異なるが、PDOなら同じ関数で操作できる。
例)データベースに接続
MySQL => mysql_connect();
PostgreSQL => pg_connect();環境
- MacBook Pro13
- MAMP ver. 6.2
MySQLデータベースに接続する
$dbh = new PDO($dsn,$user,$pass,opt);$dbh
データベースハンドルの略。(操作しますよーの意味)new PDO
PDO接続を呼び出す(PDOクラスのインスタンスを作成)$dsn
データソースネームの略。$dsn = 'mysql:host=ホスト名;dbname=db名;charset=utf8';$user
$user = 'root'; //初期設定$pass
$pass = 'root'; //初期設定opt
オプションです。さまざまなオプションがあるので、
ググってみよう。phpMyAdminでユーザを設定
ユーザとは?
データベースを操作する権限を持つ
初期設定は、全権限を持つroot(ルート)ユーザが用意権限の分け方
- 全権限(root)
- テーブルの操作権限
- カラムの操作権限
try~catchとは?
DBのエラーをチェックできる構文
例外処理と呼ばれる書き方
try { // 通常処理を書く。問題なければ次へ。 }catch() { // 例外(エラー)が発生した場合に処理 }実際にこんな感じ
try { $dbh = new PDO($dsn,$user,$pass,[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEOTION, ]); echo '接続成功'; $dbh = null; } catch(PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); };
本当にただのメモ投稿でした。以上です。
- 投稿日:2021-02-20T00:20:00+09:00
【PHP】queryとprepare/execute,fetchの意味
初めに
・PHP/MySQLを触り始めて1か月
・こちらのアプリ開発をした際に思った疑問点を深く学んでみようと思い記事を執筆課題
PHP側でデータベースから値を取得したり、データベースに値を保存したりする際に
$members = $db->prepare('...'); $members->execute('...'); $member = $members->fetch();や
$member = $db->query('...');を何気なく使っていましたが、各関数の意味をしっかり理解せずに使っていました。
現在の理解(Before)
現在の私の各関数の理解は以下の通りです。
query
SELECT文を使い、かつforeachで繰り返し処理をする際に使う関数
prepare
SELECT文を使い、かつ取り出す値が単体である(繰り返し処理等をしない)際に使う関数
execute
prepareとペアで使うので、prepareで取得したデータベース上の値をPHPで受け取る
fetch
executeで取り出した値を列毎に配列で受け取る
学習結果(After)
query
・SQLステートメントを実行し、結果セットをPDOStatementオブジェクトとして返す
⇒prepareとexecuteを一緒に実行する
・prepareとの違い:変動値がない場合// 変動値がないコード $pdo->query('SELECT * FROM user');答え合わせ:×
prepare
文を実行する準備を行い、文オブジェクトを返す
⇒実行したいSQL文をセットする
・queryとの違い:変動値がある場合// 変動値があるコード $stmt = $pdo->prepare("SELECT * FROM user WHERE name=:name");答え合わせ:△
execute
SQLステートメントを実行し、作用した行数を返す
⇒SQLの実行
答え合わせ:△fetch
結果セットから次の行を取得する
⇒executeで取得した行の値を取得する
答え合わせ:〇まとめ
・特にqueryとprepare/executeの違いが言語化しつつ学べました。
・イメージは間違えていなかったことがわかりましたが、公式ドキュメントを見ると適切な言葉選びをされている、と実感し改めて1次情報で学習を進めることの大切さを学びました。
- 投稿日:2021-02-20T00:20:00+09:00
【PHP】queryとprepare/execute/fetchの意味
初めに
・PHP/MySQLを触り始めて1か月
・こちらのアプリ開発をした際に思った疑問点を深く学んでみようと思い記事を執筆課題
PHP側でデータベースから値を取得したり、データベースに値を保存したりする際に
$members = $db->prepare('...'); $members->execute('...'); $member = $members->fetch();や
$member = $db->query('...');を何気なく使っていましたが、各関数の意味をしっかり理解せずに使っていました。
現在の理解(Before)
現在の私の各関数の理解は以下の通りです。
query
SELECT文を使い、かつforeachで繰り返し処理をする際に使う関数
prepare
SELECT文を使い、かつ取り出す値が単体である(繰り返し処理等をしない)際に使う関数
execute
prepareとペアで使うので、prepareで取得したデータベース上の値をPHPで受け取る
fetch
executeで取り出した値を列毎に配列で受け取る
学習結果(After)
query
・SQLステートメントを実行し、結果セットをPDOStatementオブジェクトとして返す
⇒prepareとexecuteを一緒に実行する
・prepareとの違い:変動値がない場合// 変動値がないコード $pdo->query('SELECT * FROM user');答え合わせ:×
prepare
文を実行する準備を行い、文オブジェクトを返す
⇒実行したいSQL文をセットする
・queryとの違い:変動値がある場合// 変動値があるコード $stmt = $pdo->prepare("SELECT * FROM user WHERE name=:name");答え合わせ:△
execute
SQLステートメントを実行し、作用した行数を返す
⇒SQLの実行
答え合わせ:△fetch
結果セットから次の行を取得する
⇒executeで取得した行の値を取得する
答え合わせ:〇まとめ
・特にqueryとprepare/executeの違いが言語化しつつ学べました。
・イメージは間違えていなかったことがわかりましたが、公式ドキュメントを見ると適切な言葉選びをされている、と実感し改めて1次情報で学習を進めることの大切さを学びました。