20210506のMySQLに関する記事は3件です。

【備忘録】既存のlaravelのプロジェクトをubuntuにデプロイする手順

はじめに この記事は、過去にローカルのdocker環境で動かしたlaravelのプロジェクトを、AWSに移行する際に行った手順を備忘録としてまとめたものになります。AWSにデプロイする際は、動作速度を鑑みて、Dockerを使わずに直接Linux環境にデプロイしました。 環境 OS : Ubuntu 20.04.2 LTS server : nginx 1.18 DB : mysql 8.0 PHP 7.4 PHP-FPM 7.4 1. 動作環境の確認 docker-compose.yml や backend/composer.json の内容をもとに、動作環境の確認を行う。 互換性のないバージョンをインストールすると、後ほど行うcomposer install でエラーになるので注意。 backend/composer.json "require": { "php": "^7.3", "fideloper/proxy": "^4.2", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", "laravel/framework": "^8.0", "laravel/tinker": "^2.0", "laravel/ui": "^3.0" } ※ ^(キャレット)について : ^1.2.3 は >=1.2.3 <2.0.0 と同等(1.2.3 以上の最新のバージョン。但し 2.0.0 未満) バージョンが 1未満の場合: ^0.3 は >=0.3.0 <0.4.0 と扱われます キャレット(^)を使うと後方互換性を維持する範囲で更新されます。 上記の例では、phpのバージョンは7.3以上8.0未満である必要があることを意味する。 composer.jsonについてや、記号の定義などは下記のサイトを参考 https://www.webdesignleaves.com/pr/php/php_composer.php 2. nginxのインストールと起動 nginxをインストールする sudo apt update sudo apt install nginx nginxを起動 sudo service nginx start ブラウザからIPアドレスにアクセスしてみて、nginxのページが表示されればOK 3. PHPのインストール PHP7.4のインストールを行う。 ※この記事を書いた当時の最新のバージョンは8.0であり、デプロイしたいプロジェクトのPHPのバージョンは7.3以上8.0未満である必要があったため、バージョンを指定してインストールを行っている。 sudo apt -y install php7.4 4. php-fpmのインストール php-fpmのインストールを行う。 sudo apt install -y php-fpm ※php-fpmはWebサーバー上でPHPを動作せるために必要なもの(のはず) php-fpmの説明は、以下のサイトが分かりやすかった https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc https://www.bnote.net/centos/php-fpm_on_nginx.html#:~:text=PHP%2DFPM%E3%81%A8%E3%81%AF,%E3%82%88%E3%81%86%E5%AE%9F%E8%A3%85%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82 5. mysqlのインストールと下準備 下記のコマンドで、mysqlのインストールを行う sudo apt install -y mysql-server 次に、mysqlに入り、ユーザーの作成・データベースの作成・権限の設定を行う。 sudo mysql mysql> create user [ユーザー名]@localhost identified by '[パスワード]'; mysql> create database [データベース名]; mysql> grant all on [データベース名].* to [ユーザー名]@localhost; 6. Laravelプロジェクトのクローンと設定 ① /var/www/直下にLaravelのプロジェクトを配置する cd /var/www sudo git clone [URL] また、必要に応じてブランチを切り替える sudo git fetch origin develop sudo git checkout develop ② 【重要】 権限の変更を行う。 nginxはデフォルトで、www-dataというユーザー名でソースにアクセスしているので、所有者をwww-dataというユーザーに変更する。 sudo chown -R www-data [プロジェクト名]/ 確認 /var/www直下で下記を実行し、 ls -al drwxr-xr-x 4 root root 4096 May 6 04:42 . drwxr-xr-x 14 root root 4096 May 6 04:39 .. drwxr-xr-x 5 www-data root 4096 May 6 05:04 hohehohe drwxr-xr-x 2 root root 4096 May 6 04:41 html 上記のように該当プロジェクトの所有者がwww-dataに変わっていればOK ③ パッケージのインストール laravelのプロジェクトを動かすのに必要なパッケージのインストールを行う。 cd /var/www/[プロジェクト名]/backend sudo apt install composer sudo apt install php-mbstring php-xml php-json sudo composer install やっていることとしては、backend直下にある「composer.json」の情報をもとに、依存パッケージをインストールし、vendor/に配置している。(下記サイト参照) https://qiita.com/masarufuruya/items/23131a465b7e9c8f3060 確認 lsコマンドで、一覧を確認し、vendorディレクトリが生成されていることを確認する /var/www/hohehohe/backend$ ls README.md composer.json package-lock.json resources vendor app composer.lock package.json routes webpack.mix.js artisan config phpunit.xml server.php bootstrap database public storage ④ .envファイルの変更 .envファイルを作成する ※既に.envファイルがある場合は不要 sudo /var/www/hohehohe/backend sudo cp .env.example .env sudo php artisan key:generate .envファイルの変更。 mysqlで作成したユーザー名・パスワード・データベース名に変更する。 .env DB_DATABASE = [データベース名] DB_USERNAME = [ユーザー名] DB_PASSWORD = [パスワード] DB_HOST=localhost ⑤ マイグレーションの実行 必要に応じて、マイグレーションを行う sudo /var/www/hohehohe/backend sudo apt-get install php7.4-mysql sudo php artisan migrate 7. nginxの設定ファイルを変更する nginxの設定ファイルである /etc/nginx/sites-enabled/default を開き、編集を行う。 sudo vi /etc/nginx/sites-enabled/default ※正確には /etc/nginx/nginx.conf に設定が書かれており、その中で、 /etc/nginx/sites-enabled/default を読むように書かれているので、serverに関することはここに書く 下記の点を変更する ① rootの変更 デフォルトでは、/var/www/htmlを見に行くようになっているので、先程クローンしたプロジェクトを見に行くように変更 # root /var/www/html; # 変更前 root /var/www/[プロジェクト名]/backend/public; # 変更後 ②index.phpの追加 今回はPHPのプロジェクトなので、index.phpも読むように設定 # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html index.php; #index.phpを追加 ③ locationの設定 指定されたファイルやディレクトリが存在しない場合に、/index.php$query_string へ内部リダイレクトするように設定 location / { # try_files $uri $uri/ =404; #変更前 try_files $uri $uri/ /index.php?$query_string; #変更後 } ※詳しい仕組みは、下記の記事が分かりやすかった https://qiita.com/k_hoso/items/33ccb5e02e73a244ed31 ④ fastcgi_paramの設定 php-fpmを使う場合の設定を location ~ .php$ で行なっている。 この辺は何やっているのか、詳しくは分かっていないので、勉強します。。 location ~ \.php$ { include snippets/fastcgi-php.conf; # コメントアウトを外す # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # コメントアウトを外す # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(.*)$; # 追加 fastcgi_param PATH_INFO $fastcgi_path_info; # 追加 } ※公式サイトの例にあった https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/ 【重要】 修正後、nginxの再起動を行う sudo service nginx restart 完成!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのEXPLAIN解説

EXPLAINとは MySQLのEXPLAINを使用することで、MySQLがクエリを実行する方法についての実行計画を知ることができます。 この実行計画によってクエリやインデックス最適化を行うことができます。 データ準備 本題に入る前に、今回の解説で利用するテーブルとデータを作成します。 下記のようなcompanyテーブル、employeeテーブル、messageテーブルを準備します。 companyテーブルの作成 mysql> CREATE TABLE `company` ( -> `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', -> `company_name` VARCHAR(50) COMMENT '会社名', -> `created_at` datetime NOT NULL COMMENT '作成日時', -> PRIMARY KEY (`id`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会社'; Query OK, 0 rows affected (0.01 sec) employeeテーブルの作成 mysql> CREATE TABLE `employee` ( -> `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', -> `name` VARCHAR(20) COMMENT '名前', -> `company_id` INT UNSIGNED NOT NULL COMMENT '会社ID', -> `created_at` datetime NOT NULL COMMENT '作成日時', -> `updated_at` datetime NOT NULL COMMENT '更新日時', -> PRIMARY KEY (`id`) -> KEY `idx_employee_created_at` (`created_at`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='従業員'; Query OK, 0 rows affected (0.01 sec) messageテーブルの作成 mysql> CREATE TABLE `message` ( -> `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', -> `employee_id` INT UNSIGNED NOT NULL COMMENT '従業員id', -> `message` TEXT COMMENT 'メッセージ', -> `created_at` datetime NOT NULL COMMENT '作成日時', -> `updated_at` datetime NOT NULL COMMENT '更新日時', -> PRIMARY KEY (`id`), -> KEY `idx_message_employee_id` (`employee_id`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='メッセージ'; Query OK, 0 rows affected (0.00 sec) companyのデータ準備 mysql> INSERT INTO company VALU (1, '株式会社hoge', NOW());); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO company VALUES (10, 'fuga株式会社', NOW()); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM company; +----+------------------+---------------------+ | id | company_name | created_at | +----+------------------+---------------------+ | 1 | 株式会社hoge | 2021-05-06 16:04:29 | | 10 | fuga株式会社 | 2021-05-06 16:04:56 | +----+------------------+---------------------+ 2 rows in set (0.01 sec) employeeのデータ準備 mysql> INSERT INTO employee VALUES (1, '山田', 1, NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO employee VALUES (2, '佐藤', 10, NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM employee; +----+--------+------------+---------------------+---------------------+ | id | name | company_id | created_at | updated_at | +----+--------+------------+---------------------+---------------------+ | 1 | 山田 | 1 | 2021-05-06 16:07:30 | 2021-05-06 16:07:30 | | 2 | 佐藤 | 10 | 2021-05-06 16:07:38 | 2021-05-06 16:07:38 | +----+--------+------------+---------------------+---------------------+ 2 rows in set (0.00 sec) messageのデータ準備 mysql> INSERT INTO message VALUES (1, 1, 'こんにちは', NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO message VALUES (2, 2, '元気ですか', NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO message VALUES (3, 1, 'hello', NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO message VALUES (4, 1, 'good night', NOW(), NOW()); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM message; +----+-------------+-----------------+---------------------+---------------------+ | id | employee_id | message | created_at | updated_at | +----+-------------+-----------------+---------------------+---------------------+ | 1 | 1 | こんにちは | 2021-05-06 16:08:30 | 2021-05-06 16:08:30 | | 2 | 2 | 元気ですか | 2021-05-06 16:08:36 | 2021-05-06 16:08:36 | | 3 | 1 | hello | 2021-05-06 16:38:59 | 2021-05-06 16:38:59 | | 4 | 1 | good night | 2021-05-06 16:39:10 | 2021-05-06 16:39:10 | +----+-------------+-----------------+---------------------+---------------------+ 4 rows in set (0.00 sec) EXPLAINの実行方法 EXPLAINの実行方法はとても簡単で、下記のように実行計画を見たいクエリの先頭にEXPLAINをつけるだけです。 EXPLAINの実行 --- 下記のクエリの実行計画を確認する --- SELECT id FROM user WHERE id = 1; mysql > EXPLAIN SELECT id FROM user WHERE id = 1; +----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+ | 1 | SIMPLE | user | NULL | ALL | NULL | NULL | NULL | NULL | 100 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+ EXPLAIN結果の見方 EXPLAINの目的・実行方法が分かったところで、EXPLAINの出力結果の意味を解説していきます。 id idはSELECT識別子で、実行順序を表します。 table クエリを発行しているテーブル。 select_type select_typeは、SELECTの種類を表します。 種類は以下の通りです。 SIMPLE UNIONやサブクエリを使わない単純なSELECT。 SIMPLEの例 mysql> EXPLAIN SELECT * FROM employee WHERE id = 1; +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | 1 | SIMPLE | employee | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL | +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec) PRIMARY 外部クエリのSELECT。 SUBQUERY サブクエリ内の最初のSELECT。 PRIMARYとSUBQUERYの例 mysql> EXPLAIN SELECT * FROM employee WHERE id = (SELECT employee_id FROM message where id = 1); +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | 1 | PRIMARY | employee | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL | | 2 | SUBQUERY | message | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL | +----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ 2 rows in set, 1 warning (0.01 sec) UNION UNION内の2つ目以降のSELECT。 UNION RESULT UNIONの結果。 UNIONとUNION_RESULTの例 mysql> EXPLAIN SELECT id as employee_id FROM employee WHERE created_at < '2021-05-06 15:20:00' UNION SELECT employee_id FROM message; +----+--------------+------------+------------+-------+-------------------------+-------------------------+---------+------+------+----------+--------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------+------------+------------+-------+-------------------------+-------------------------+---------+------+------+----------+--------------------------+ | 1 | PRIMARY | employee | NULL | range | idx_employee_created_at | idx_employee_created_at | 5 | NULL | 1 | 100.00 | Using where; Using index | | 2 | UNION | message | NULL | index | NULL | idx_message_employee_id | 4 | NULL | 2 | 100.00 | Using index | | NULL | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary | +----+--------------+------------+------------+-------+-------------------------+-------------------------+---------+------+------+----------+--------------------------+ 3 rows in set, 1 warning (0.00 sec) DEPENDENT UNION 相関関係のあるUNION。 UNION内で相関関係のあるサブクエリが使用された場合、こちらに当てはまります。 DEPENDENT SUBQUERY 相関関係のあるサブクエリ。 DERIVED FROM内で使用しているサブクエリ。 DEPENDENT DERIVED 別のテーブルに依存する導出テーブル。 MATERIALIZED 実体化されたサブクエリ UNCACHEABLE SUBQUERY キャッシュできず、外部クエリの行ごとに実行されるサブクエリ。 UNCACHEABLE UNION UNCACHEABLE SUBQUERYのうち、UNION内の2つ目以降のSELECT。 partitions 一致するパーティション。 type テーブルの結合方法。 種類は以下の通りです。 system テーブルに行が1行しかありません。 const 一致するレコードが最大で1つであり、非常に高速です。 プライマリキーとユニークキーを定数値と比較する時に使用されます。 eq_ref 前のテーブルの行の組み合わせごとに、このテーブルから1行ずつ読み取られる。 結合でインデックスが使用されており、インデックスがプライマリキーまたはユニークキー(NOT NULL)である場合に使用されます。(つまりconstとの違いは、結合でインデックスが使用されていること。) 単一の行の絞り込みが可能であるため、system・constの次に高速で最適なtype。 ref プライマリキーまたはユニークキー以外のインデックスを用いて等価検索(=または<=>)を行った場合に使用されます。 単一の行の絞り込みはできませんが、使用されているキーが数行の場合は適切な結合型です。 このカラムにfuncが格納されている場合、特定の関数や演算子の結果です。詳細を知りたい場合、EXPLAIN実行後にSHOW WARNINGS;を実行することで確認できます。 fulltext FULLTEXTインデックスを使用しています。 index_merge インデックスマージ最適化が行われています。 unique_subquery INサブクエリでプライマリキーまたはユニークキーをSELECTする場合に使用されます。 index_subquery INサブクエリでプライマリキーまたはユニークキー以外のカラムをSELECTする場合に使用されます。 range インデックスを用いて特定の範囲の行を取得する場合に使用されます。 このtypeのkeyカラムは、使用されるインデックスを示し、key_lenカラムには使用された最長のインデックスパートが格納されます。 このtypeのrefカラムはNULLになります。 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE または IN()の演算子を用いてキーカラムを定数と比較する場合に使用されます。 index indexは下記の2つの方法に分かれます。 インデックスがクエリのカバリングインデックスで、インデックスツリーのみが参照される場合に使用されます。このとき、ExtraカラムにはUsing indexが格納されます。 インデックスがカバリングインデックスでなく、フルテーブルスキャンが行われます。インデックスからの読み取りを使用して、インデックス順でデータ行をルックアップして実行されます。このとき、ExtraカラムにはUses indexが格納されます。 ALL インデックスが全く使用されていないフルテーブルスキャンの場合に使用されます。 パフォーマンスがかなり悪いのでチューニングの必要があります。 Possible keys 選択可能なインデックスが格納されます。 keys 実際に使用されたインデックスが格納されます。 rows fetchされる行数の見積もり。 あくまでも見積もりなので、実際にfetchされる行数とは異なります。 filtered フィルタ処理される行数の割合。 最大値は100で、このときフィルタ処理されなかったことを表し、数字が小さくなるほどフィルタリングされた行が増加したことを示します。 key_len 使用するキーの長さを示します。短いほうが速いです。 ref 実際に使用されたインデックス(keysカラムに格納されたインデックス)と比較される値またはカラム。 値が指定されている場合は、constが格納されます。 Extra Extraカラムには、実行計画の追加情報が格納されます。 特によく見る種類だけ書いておきます。 Using where WHERE句で検索条件が指定されており、インデックスだけではその検索条件を適用できない場合に使用されます。 Using filesort クイックソートが使用されています。 Using index 上でも記載の通り、typeカラムがindexでインデックスがカバリングインデックスの場合に使用されます。 Uses index 上でも記載の通り、typeカラムがindexでインデックスがカバリングインデックスでない場合に使用されます。 参考サイト EXPLAIN出力フォーマット MySQLのEXPLAINを徹底解説!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# (.NET Core 5.0) Web API CRUD実装

概要 .NET Core 5.0 Web APIサーバを実装して、MySQL接続&CRUD実装をおこなう。 バージョン Version .NET Core 5.0 MySQL 8.0.22 簡易設計・実装 簡易設計 MySQL テスト用DB testデータベースを作成し、以下の2つのテーブルを作成する。 helloテーブル Field Type Null Key id int NO PRI name varchar(128) NO hello_itemテーブル Field Type Null Key id int NO PRI name varchar(128) NO API I/F Resource path HTTP Method Request Body Response Body /hello GET n/a [{"id": 1, "name": ""}] /hello POST {"id": 1, "name": ""} {"id": 1, "name": ""} /hello/{id} PUT {"name": ""} {"id": 1, "name": ""} /hello/{id} DELETE n/a {"message": "ok"} 設定値の定義 パッケージ MySQLの8系を利用するとEntityFrameworkCoreの5系では未対応のため、3系を利用する。 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <RootNamespace>http_api</RootNamespace> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="5.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.10" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.10" /> <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.22" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" /> </ItemGroup> </Project> 接続情報 ※ 本ドキュメントはMySQL接続してCRUDをおこうことが目的のため、Secret情報の考慮はしていません。 appsettings.jsonに接続情報を追加する。 "ConnectionStrings": { "DefaultConnection": "Server=127.0.0.1;Database=test;User=root;Password=root;" } Entityの実装 定義したテーブルのEntityクラスを実装する。 Hello.cs public class Hello { public long Id { get; set; } [Required] [StringLength(100, ErrorMessage = "Name is within 100 length")] public string Name { get; set; } } HelloItem.cs public class HelloItem { public long Id { get; set; } [Required] [StringLength(100, ErrorMessage = "Name is within 100 length")] public string Name { get; set; } } DbContextの実装 Microsoft.EntityFrameworkCoreのDbContextを継承して実装する。 OnModelCreating関数のBuilderでどのEntityがどのテーブルにマッピングするか定義できるので利用する。 Microsoft.EntityFrameworkCore ModelBuilder Class public class MysqlContext : DbContext { public MysqlContext(DbContextOptions<MysqlContext> options) : base(options) { Console.WriteLine("Generated MysqlContext"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<HelloItem>().ToTable("hello_item"); modelBuilder.Entity<Hello>().ToTable("hello"); } public DbSet<Hello> Hellos { get; set; } public DbSet<HelloItem> HelloItems { get; set; } } サーバのServiceCollectionの実装 実装したMysqlContextの接続数は1つとして、1つのConnectionを使い回すようにする。 Startup.csのDbContextPoolでMysqlContextをAddする。 public void ConfigureServices(IServiceCollection services) { ... Console.WriteLine(Configuration.GetConnectionString("DefaultConnection")); services.AddDbContextPool<MysqlContext>(opt => opt.UseMySQL(Configuration.GetConnectionString("DefaultConnection"))); ... } Controllerの実装 HelloテーブルのCRUDを実装する。 先ほど実装したMysqlContextをSingletonインスタンスで保持するようにDIする。 MysqlContextのコンストラクタに Generated MysqlContext" とログを入れているので、期待値は一度だけ出力されていれば良い。 public class HelloController : ControllerBase { private readonly MysqlContext _mysqlContext; public HelloController(MysqlContext mysqlContext) { _mysqlContext = mysqlContext; Console.WriteLine("Generated HelloController"); } [HttpGet] public List<Hello> Get() { var list = _mysqlContext.Hellos.ToList(); return list; } [HttpPost] public Hello Post(Hello hello) { _mysqlContext.Hellos.Add(hello); _mysqlContext.SaveChanges(); return hello; } [HttpPut("{id}")] public Hello Put(long id, Hello hello) { hello.Id = id; _mysqlContext.Hellos.Update(hello); _mysqlContext.SaveChanges(); return hello; } [HttpDelete("{id}")] public IDictionary<string, string> Delete(long id) { var hello = new Hello(); hello.Id = id; _mysqlContext.Hellos.Remove(hello); _mysqlContext.SaveChanges(); IDictionary<string, string> map = new Dictionary<string, string>(); map.Add("message", "ok"); return map; } } サーバの起動 実装したAPIサーバを起動する。 バイナリにするまでもないので、runで実行する。 $ dotnet run Building... Server=127.0.0.1;Database=test;User=root;Password=root; info: Microsoft.Hosting.Lifetime[0] Now listening on: http://[::]:8080 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development 動作確認 POST クライアントのログ。 $ curl -i -X POST \ -H "Content-Type: application/json" \ -d "{\"name\": \"test_data01\"}" \ http://localhost:8080/hello HTTP/1.1 200 OK Date: Thu, 06 May 2021 04:00:39 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked {"id":24,"name":"test_data01"} サーバのログ。 サーバ起動後の初回リクエストにおいて、MySQLのSingletonインスタンスが生成されることでMySQL接続までの時間がレイテンシに乗っていることがわかった。サーバ起動時にMySQLのConnectionをはることができないかは調査が必要。 Generated MysqlContext Generated HelloController instance GET クライアントのログ。 $ curl -i -X GET http://localhost:8080/hello HTTP/1.1 200 OK Date: Thu, 06 May 2021 04:03:54 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked [{"id":1,"name":"string"}, {"id":24,"name":"test_data01"}] サーバのログ。 MysqlContextのログは出力されていないので、使いまわすことができている。 Generated HelloController instance PUT クライアントのログ。 $ curl -i -X PUT \ -H "Content-Type: application/json" \ -d "{\"name\": \"test_data01_updated\"}" http://localhost:8080/hello/24 HTTP/1.1 200 OK Date: Thu, 06 May 2021 04:06:09 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked {"id":24,"name":"test_data01_updated"} サーバのログ。 Generated HelloController instance DELETE クライアントのログ。 $ curl -i -X DELETE http://localhost:8080/hello/24 HTTP/1.1 200 OK Date: Thu, 06 May 2021 04:07:18 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked {"message":"ok"} サーバのログ。 Generated HelloController instance 所感 サーバ起動時にMySQLに接続しておきたい。 サーバ起動条件の設定を少し調べて、条件満たさない場合のサーバシャットダウン処理等はまた別ドキュメントでまとめていきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む