転職したらスマレジだった件

スマレジのエンジニアやまてのテックブログです。マジレス大歓迎です。

独学エンジニアの課題として、ログ解析システムを作った。 Step2. DBのテーブル作成

この記事は「 つながる勉強会 Advent Calendar 2022 - Adventar 」の 14 日目の記事です。

adventar.org

前日は、リリー🕊Webエンジニア🐶(@lily_otk) さんでした!

lily-eng.com

数日前につながる勉強会でリリーさんに会いましたがめっちゃ良い人でした。めっちゃ。


こんにちは!

スマレジ・テックファーム の Webエンジニア やまて と申します。

はじめに

「独学エンジニアの課題として、ログ解析システムを作った。」というタイトルで、課題の製作物完成までの道のりを投稿しています。

GitHub の Public リポジトリで誰でも閲覧できるようにしています。

github.com


独学エンジニア とは

『独学エンジニア』とは、Web開発(主にサーバーサイド)の動画学習教材です。

dokugaku-engineer.com

連載の目次

「独学エンジニアの課題として、ログ解析システムを作った。」の連載については、以下の順に投稿しています。

今回は Step2.DBのテーブル作成 です。

目次

環境

バージョン
macOS Big Sur 11.6
Docker Desktop 4.7.0
PHP 8.1.7
MySQL 8.0.28

1. テーブル定義の設定

以下のとおり、テーブル定義を設定します。

  • テーブル名:page_views
カラム名 項目名 データ型 例1 例2
domain_code ドメインコード string aa aa
page_title ページタイトル string Main_Page Wikipedia
count_views 各時間のページ表示回数 int 4 1
total_response_size 合計レスポンスサイズ int 0 0

2. PHP から DB を操作するファイルの作成

PDO モジュールを使用して、 PHP から DB を操作( page_views テーブルを作成)するファイルを作成します。

  • 作成・編集:src/databases/initialize_page_views_table.php
<?php

function dbConnect(): PDO
{
    $dbHost = 'db';
    $dbUsername = 'test_user';
    $dbPassword = 'pass';
    $dbDatabase = 'test_database';
    $dataSourceName = "mysql:host=$dbHost;dbname=$dbDatabase;charset=utf8mb4";

    try {
        $dbh = new PDO($dataSourceName, $dbUsername, $dbPassword, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ]);
    } catch (PDOException $e) {
        echo 'DB接続エラー' . $e->getMessage();
        exit();
    };

    return $dbh;
}

function dropPageViewsTable(PDO $dbh)
{
    $sql = 'DROP TABLE IF EXISTS page_views;';
    $sth = $dbh->query($sql);
    if ($sth) {
        echo 'テーブル削除完了: page_views' . PHP_EOL;
    } else {
        exit('テーブル削除エラー: page_views' . PHP_EOL);
    }
    $sth = null;
}

function createPageViewsTable(PDO $dbh)
{
    $sql = <<<EOI
    CREATE TABLE page_views (
        domain_code VARCHAR(100),
        page_title VARCHAR(100),
        count_views INTEGER,
        total_response_size INTEGER
    );
    EOI;
    $sth = $dbh->query($sql);
    if ($sth) {
        echo 'テーブル作成完了: page_views' . PHP_EOL;
    } else {
        exit('テーブル作成エラー: page_views' . PHP_EOL);
    }
    $sth = null;
}

$dbh = dbConnect();
dropPageViewsTable($dbh);
createPageViewsTable($dbh);
$dbh = null;

PDO モジュール

  • 参考:公式ドキュメント

PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。

www.php.net

機密データの扱い

以下のパスワードなどは機密データであるため、ソースコードとは別で管理するために phpdotenv などで環境変数に置き換えるべきかと思います。

    $dbHost = 'db';
    $dbUsername = 'test_user';
    $dbPassword = 'pass';
    $dbDatabase = 'test_database';
    $dataSourceName = "mysql:host=$dbHost;dbname=$dbDatabase;charset=utf8mb4";

github.com

今回は、課題であるデータベース、SQLスキルの向上に専念するため、環境変数として分離していません。

3. PHP から DB の操作の実行

PHP から DB の操作を実行します。

3-1. Docker コンテナの起動

Docker コンテナを起動します。

docker-compose up -d
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:15:45] C:1
$ docker-compose up -d
Creating wikipedia-log-analysis-tool_db_1 ... done
Creating wikipedia-log-analysis-tool_app_1 ... done

Docker コンテナ起動の状況を確認します。

docker-compose ps
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:16:13]
$ docker-compose ps
              Name                             Command                       State                               Ports
------------------------------------------------------------------------------------------------------------------------------------------
wikipedia-log-analysis-tool_app_1   docker-php-entrypoint apac ...   Up                      0.0.0.0:50080->80/tcp
wikipedia-log-analysis-tool_db_1    /entrypoint.sh mysqld            Up (health: starting)   0.0.0.0:53306->3306/tcp, 33060/tcp, 33061/tcp

3-2. page_views テーブルを作成するファイルの実行

「2. PHP から DB を操作するファイルの作成」で作成した、 page_views テーブルを作成する initialize_page_views_table.php ファイルを実行します。

docker-compose exec app php databases/initialize_page_views_table.php
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:17:24]
$ docker-compose exec app php databases/initialize_page_views_table.php
テーブル削除完了: page_views
テーブル作成完了: page_views

3-3. page_views テーブルの確認

page_views テーブルが作成されているか確認するため、MySQL に接続して SHOW COLUMNS で確認します。

docker-compose exec app mysql -h db -u test_user -D test_database -p
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:26:30]
$ docker-compose exec app mysql -h db -u test_user -D test_database -p
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [test_database]>
SHOW COLUMNS FROM page_views;
MySQL [test_database]> SHOW COLUMNS FROM page_views;
+---------------------+--------------+------+-----+---------+-------+
| Field               | Type         | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| domain_code         | varchar(100) | YES  |     | NULL    |       |
| page_title          | varchar(100) | YES  |     | NULL    |       |
| count_views         | int          | YES  |     | NULL    |       |
| total_response_size | int          | YES  |     | NULL    |       |
+---------------------+--------------+------+-----+---------+-------+
4 rows in set (0.003 sec)

テーブル定義のとおり、作成できていることが確認できました。

おわりに

今回は「独学エンジニアの課題として、ログ解析システムを作った。」の Step2.DBのテーブル作成 でした。

次回は、Step3. データのインポート について投稿します。

ありがとうございました。



学んだ技術をブログ記事として定期的にアウトプットすることで、成長する機会、振り返る機会になると考えてブログ運営をしています。ブログ手当としてサポートしてもらえることで意欲も高まるため、とてもありがたいです!

というコメントを顔写真入りで掲載いただきました!ブログ記事の投稿、しっかりやっていきます。