20201223のMySQLに関する記事は9件です。

【Nuxt.js】API(バックエンド)でMySQLからテーブル情報を取得しフロントエンドで表示させるアプリの作成

1 はじめに

【アプリ作成の目的】
フロントエンド(Nuxt.js),バックエンド(express)を利用したアプリ作成を理解する。フロントエンドとサーバーエンドを分離したアプリとする。

【フロントエンドで行うこと】
・axiosを利用してバックエンド側(API)にリクエストを投げ、取得したデータを表示させる。
・ホームディレクトリは、「nuxt-scraping-app」とする。

【バックエンドで行うこと】
・事前にスクレイピングしてMySQLに保存したデータをjsonで返すAPIを作成する。
・ホームディレクトリは、「api-nuxt-puppeteer」とする。

【注意点】
※今回スクレイピング部分のコードに関しては、割愛させていただきます。
※スクレイピングの情報取得先はファッション系サイトであるfarfetchの商品を選択しました(sacaiのアイテム)。
※まだ理解が浅い為間違っている箇所はご指摘いただけると助かります!

【完成形】
スクリーンショット 2020-12-24 13.18.32.png

2 APIの作成(サーバーエンド)

サーバーサイドにExpressを利用する。
※Expressとは、Node.jsのフレームワーク。Rubyで言うところのRails。
こちらの説明がわかりやすかったです↓
expressは一体何をしとるんじゃ・・・

【手順】

nuxt-scraping-app
 npm install express # npmを利用
 yarn add express # yarnを利用

ホームディレクトリで上記のようにどちらかでexpressを導入する。
ちなみに、「npm install express --save」のように記載している記事がありますが、「--save」はnpmバージョン5.0.0からオプションを付けなくてもデフォルトでsaveされる為、必要ないようです。
npm install時に「--save」オプションはいらない

今回npmコマンドを利用する為、package.jsonのdependenciesにexpressが追加されていることを確認する↓

package.json
  "dependencies": {
    "@nuxtjs/axios": "^5.12.2",
    "core-js": "^3.6.5",
    "express": "^4.17.1", # New!
    "mysql": "^2.18.1",
    "mysql2": "^2.2.5",
    "nuxt": "^2.14.6",
    "sequelize": "^6.3.5"
  },

今回、APIを作成する為、apiディレクトリを作成し、index.jsを作成し以下のように記載。

api/index.js
const express = require('express'); //expressを利用することを定義
const app = express(); # expressをappと定義

const mysql      = require('mysql'); //今回はMySQLを利用する
const connection = mysql.createConnection({ // 以下、各自のMySQLへの接続情報を書く
  host     : 'localhost',
  user     : 'root',
  password : '******',
  database : 'db_development'
});

app.get('/', function (req, res) { // app.get...(expressの構文)、req=request。 res=response
  res.set({ 'Access-Control-Allow-Origin': '*' }); // この記載により、※1:CORSを許可する
  connection.query('select * from scrapings', function (error, results) { // scrapingsテーブルから全てのカラムを取得する
    if (error) throw error; // エラー処理
    res.send(results[0]); // results[0]により、一番目のデータを返答する
  });
});

app.listen(5000, function () { // port 5000listenする
  console.log('Example app listening on port 5000!'); // console.logによりファイル実行時にコンソールに文字表示させる
});

※1 CORS...オリジン間リソース共有。このコードを入れないとエラー発生してブラウザで見ることができません。こちらの記事が分かりやすかったです。難しい為私も絶賛勉強中です!
・なんとなく CORS がわかる...はもう終わりにする。
・CORS(Cross-Origin Resource Sharing)

↓MySQLのカラム情報は以下の通りです。

MySQL(Local)
mysql> describe scrapings;+--------------+--------------+------+-----+---------+----------------+| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int          | NO   | PRI | NULL    | auto_increment |
| imageUrl     | varchar(255) | YES  |     | NULL    |                |
| brandName    | varchar(255) | YES  |     | NULL    |                |
| itemName     | varchar(255) | YES  |     | NULL    |                |
| price        | int          | YES  |     | NULL    |                |
| material     | varchar(255) | YES  |     | NULL    |                |
| brandStyleId | varchar(255) | YES  |     | NULL    |                |
| createdAt    | datetime     | NO   |     | NULL    |                |
| updatedAt    | datetime     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

MySQLについて、Sequelizeと言うORM(*ORM...オブジェクトリレーションマッピング)を利用するとMySQL操作が容易になります。ここでは詳しく触れませんが、MySQLにターミナルからQUery操作しなくても、テーブルに改修を加えることができます。しかし、私を含め、初学者の方は直のSQL操作をで基礎的事項として覚えた方がよいと感じました。

Sequelizeについてはこちらが分かりやすかったです!
Node.JSのSequelize ORM入門

/api
$ node index.js 

により起動させます。注意として、index.jsを置いているディレクトリ(/api)で実行してください。ホームディレクトで実行するとエラーで実行できません。

API(サーバーエンド)側は以上です。

3 フロントエンドの作成(Nuxt.js)

CSSフレームワークとしてVuetifyを利用。モダンなフロントデザインにできるのでオススメです。create-nuxt-appでデフォルトでVuetify.jsを選択できるので、特に別途でinstallは必要はありません。

desktop
$ create-nuxt-app api-nuxt-puppeteer
 Choose UI framework (Use arrow keys)
  None
  Ant Design Vue
  Bootstrap Vue
  Buefy
  Bulma
  Element
  Framevuerk
  iView
  Tachyons
  Tailwind CSS
  Vuetify.js # ←こちら!

同時に、「Choose Nuxt.js modules」でaxiosも選択しておきます(※axios...HTTP通信を簡単に行うことができるJavaScriptライブラリ。主にJSONの取得に利用されることが多い)。axiosについて詳しくはこちら↓
axios の導入と簡単な使い方

既存アプリにaxiosを導入する場合はこちら↓

$ npm install axios

Nuxtではpagesディレクトリ配下にファイルを置くと、自動的にルーティングされる
(例: pages/about.js...http://localhost:3000/about)

今回は特にルーティングは使用しない為、index.vueに書いていきます(フロントは簡素化しています)。

pages/index.js
<template>
  <v-card class="mx-auto">
    <v-list-item>
      <div class="scraping">
        <h5>ID{{ items.id }}</h5>
        <h5>商品画像URL:{{ items.imageUrl }}</h5>
        <h5>ブランド名:{{ items.brandName }}</h5>
        <h5>アイテム名:{{ items.itemName }}</h5>
        <h5>価格:¥{{ items.price }} (税込)</h5>
        <h5>素材:{{ items.material }}</h5>
        <h5>ブランドスタイルID:{{ items.brandStyleId }}</h5>
      </div>
    </v-list-item>
  </v-card>
</template>

<script>
export default {
  async asyncData({ $axios }) {
    const items = await $axios.$get("http://localhost:5000");
    return { items };
  },
};
</script>
pages/index.js
<script>
export default {
  async asyncData({ $axios }) { 
    const items = await $axios.$get("http://localhost:5000");
    return { items };
  },
};
</script>

asyncDataで外部からデータを取得します。今回の場合は、http://localhost:5000
に表示しているMySQLから取得した情報(api側)をフロント側から表示させます。itemsとしてreturnします。

pages/index.js
 <h5>ID{{ items.id }}</h5>

このように、itemsとして返された情報を、例としてidカラムと指定することで、フロントに表示させます。

以上で、npm run dev, yarn devでローカルでサーバーを実行させると、最初のように表示できるはずです。

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

【Nuxt.js】API(サーバーサイド)でMySQLからテーブル情報を取得しクライアントサイドで表示させる【Express】

1 はじめに

・APIアプリ(サーバーサイド)...MySQLに接続し、テーブルから情報を取得させます。
・フロントアプリ(クライアントサイド)... axiosによりlocalhost:5000に繋いでjsonで返してindex.vueに表示させます。

上記をNuxt.jsにより作成し、ローカル環境でフロントアプリからaxiosにより情報取得し、表示させる。
※各種installコマンド等は省きます
※まだ理解が浅い為間違っている箇所はご指摘いただけると助かります!

完成形↓
スクリーンショット 2020-12-23 18.31.53.png

API側でMySQLからテーブルとカラムを取得し、フロント側でシンプルに表示させる。

2 APIアプリの作成

サーバーサイドにExpressを利用する。
※Expressとは、Node.jsのフレームワーク。Rubyで言うところのRails。
こちらの説明がわかりやすかったです。→https://qiita.com/ganariya/items/85e51e718e56e7d128b8

各種コマンドにより、Nuxt.jsにExpressをインストールする。
今回、APIを作成する為、apiディレクトリを作成し、index.jsを作成し以下のように記載。

api/index.js
const express = require('express');
const app = express();

const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '******',
  database : 'db_development'
});

app.get('/', function (req, res) {
  res.set({ 'Access-Control-Allow-Origin': '*' });
  connection.query('select * from users', function (error, results, fields) {
    if (error) throw error;
    res.send(results[0]);
  });
});

app.listen(5000, function () {
  console.log('Example app listening on port 5000!');
});

const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '******',
  database : 'db_development'
});

↑こちらでMySQLに接続します。

app.get('/', function (req, res) {
  res.set({ 'Access-Control-Allow-Origin': '*' });
  connection.query('select * from users', function (error, results, fields) {
    if (error) throw error;
    res.send(results[0]);
  });
});

↑こちらでMySQLのdb-developmentのusersテーブルからカラム全てを取得します。
app.get(...)はExpressの構文です。reqはリクエスト、resはレスポンス。

↓MySQLのカラム情報は以下の通りです。

MySQL(Local)
mysql> select * from users;
+----+-----------+------------------------+-------+--------------------------------------------------------------------------------+--------------+---------------------+---------------------+
| id | brandName | itemName               | price | material                                                       | brandStyleId | createdAt           | updatedAt  |
+----+-----------+------------------------+-------+--------------------------------------------------------------------------------+--------------+---------------------+---------------------+
|  1 | Sacai     | パネル セーター          | 86900 | ナイロン 100%、ウール 100%、コットン 50%、ポリエスエル 50%       | 2002359M     | 2020-12-20 01:30:07 | 2020-12-20 01:30:10|
+----+-----------+------------------------+-------+--------------------------------------------------------------------------------+--------------+---------------------+---------------------+
1 row in set (0.00 sec)

以下のようにport:5000をlistenします。console.logによりターミナルでの文字表示をさせます。

app.listen(5000, function () {
  console.log('Example app listening on port 5000!');
});

MySQLについて、Sequelizeと言うORM(*ORM...オブジェクトリレーションマッピング)を利用するとMySQL操作が容易になります。ここでは詳しく触れませんが、MySQLにターミナルからQUery操作しなくても、テーブルに改修を加えることができます。私を含め、初学者の方は直のSQL操作をで基礎的事項として覚えた方がよいと感じました。
Sequelizeについてはこちらが分かりやすかったです!→https://qiita.com/markusveeyola/items/64875c9507d5fa32884e

$ node index.js 

により起動させます。
API側は以上です。

3 フロントアプリの作成

CSSフレームワークとしてVuetifyを利用。モダンなフロントデザインにできるのでオススメです。
nuxt-create-appでデフォルトでVuetifyを選択できるので、特にinstallは必要はありません。
同時にaxiosも選択しておきます(※axios...非同期通信を行う。

Nuxtではpagesディレクトリ配下にファイルを置くと、自動的にルーティングされる。
(例: pages/about.js...http://localhost:3000/about)

今回は特にルーティングは使用しない為、index.vueに書いていきます(フロントは簡素化しています)。

index.js
<template>
  <v-card class="mx-auto" max-width="500" max-height="500">
    <v-list-item>
      <div class="scraping">
        <h5>ID{{ items.id }}</h5>
        <h5>ブランド名:{{ items.brandName }}</h5>
        <h5>アイテム名:{{ items.itemName }}</h5>
        <h5>価格:¥{{ items.price }} (税込)</h5>
        <h5>素材:{{ items.material }}</h5>
        <h5>ブランドスタイルID:{{ items.brandStyleId }}</h5>
      </div>
    </v-list-item>
    <br />
  </v-card>
</template>

<script>
export default {
  async asyncData({ $axios }) {
    const items = await $axios.$get("http://localhost:5000");
    return { items };
  },
};
</script>
<script>
export default {
  async asyncData({ $axios }) {
    const items = await $axios.$get("http://localhost:5000");
    return { items };
  },
};
</script>

asyncDataで外部からデータを取得します。今回の場合は、http://localhost:5000
に表示しているMySQLから取得した情報(api側)をフロント側から表示させます。itemsとしてreturnします。

 <h5>ID:{{ items.id }}</h5>

このように、itemsとして返された情報を、例としてidカラムと指定することで、フロントに表示させます。

以上で、npm run dev, yarn devでローカルでサーバーを実行させると、最初のように表示できるはずです。

学び

今までRailsを主に触ってきたこともありAPIやJavaScriptについての理解が浅く、更に深い理解が必要だと感じた。モダンなWEBアプリ開発を行っていく中で、Rest APIを利用したSPA,SSRアプリ制作は今後デファクトスタンダードになっていくと思うので、インプットを更に励む必要がある。

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

[Node.js] Node.jsを用いてMySQLにデータを登録する

Node.jsを用いてMySQLにデータを登録する

※ 自分用の覚え書きでございます。

Node.jsを用いてMySQLにデータを登録します。ローカル環境で実行しています。

MySQLに作成したテーブル

f_id , f_name , f_age という3つのフィールドを作成しました。

007a.png

Node.js側の記述

/ (localhostのルート) にアクセスしたとき、SELECT文を実行します。
/entry に post したとき、INSERT文を実行します。

app.js
const express = require('express');
const mysql = require('mysql');
const app = express();

app.use(express.urlencoded({extended: false}));

const connection = mysql.createConnection({
  host: 'localhost',
  user: '********',
  password: '********',
  database: 'db_users'
});

app.get('/', (req, res) => {
  connection.query(
    'SELECT * FROM tbl_users',
    (error, results) => {
      res.render('index.ejs', {items: results});
    }
  );
});

app.get('/entry', (req, res) => {
  res.render('entry.ejs');
});

app.post('/entry', (req, res) => {
  connection.query(
    'INSERT INTO tbl_users (f_name, f_age) VALUES (?, ?)',
    [req.body.userName, req.body.userAge],
    (error, results) => {
      res.redirect('/');
    }
  );
});

app.listen(3000);

localhostにアクセスしたときの画面表示 : index.ejs

index.ejs
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>db_users</title>
  </head>
  <body>
    <a href="/entry">+ 新規登録</a>
    <ul>
      <li>
        <span>ID</span>
        <span>名前</span>
        <span>年齢</span>
      </li>
    </ul>
    <ul>
      <% items.forEach((item) => { %>
        <li>
          <span><%= item.f_id %></span>
          <span><%= item.f_name %></span>
          <span><%= item.f_age %></span>
        </li>
      <% }) %>
    </ul>
  </body>
</html>

/entry の画面表示 : entry.ejs

entry.ejs
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>db_users</title>
  </head>
  <body>
    <form action="/entry" method="post">
      名前:<input type="text" name="userName">
      年齢:<input type="number" name="userAge">
      <input type="submit" value="登録">
    </form>
  </body>
</html>

ブラウザからデータを登録

・localhostにアクセスします。
 →いま、2人登録されています。

008a.png

・新規登録をクリックすると入力フォームが表示されます。
 →やまださぶろう さんを登録します。

009a.png

・登録をクリックすると入力されたデータが登録、表示されます。
 →やまださぶろう さんが登録されました。

010a.png

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

2020年2月29日の2年後は2022年何月何日?

はじめに

現在、開発をしているプロジェクトがありまして、レコードの日付を2年ずらしてデータをずらしたことがありました。その時、たまたま 2020年2月29日 もその中に入っておりました。その時に得た結果をご披露します。この記事はソフトウェアテストの小ネタ Advent Calendar 2020 - Qiitaの25日目です。

MySQL

まず MySQL の場合は 2020年2月29日 の2年後は 2022年2月28日 になりました。

mysql> SELECT DATE_ADD( '2020-02-29', interval '2' YEAR ) ;
+---------------------------------------------+
| DATE_ADD( '2020-02-29', interval '2' YEAR ) |
+---------------------------------------------+
| 2022-02-28                                  |
+---------------------------------------------+
1 row in set (0.01 sec)
mysql>

逆に2020年2月29日 の2年前は 2018年2月28日 になりました。

mysql> SELECT DATE_ADD( '2020-02-29', interval '-2' YEAR ) ;
+----------------------------------------------+
| DATE_ADD( '2020-02-29', interval '-2' YEAR ) |
+----------------------------------------------+
| 2018-02-28                                   |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql>

PostgreSQL

PostgreSQLの場合も MySQL と同様です。

postgres=# select cast('2020/2/29' as date) + cast('2 years' as INTERVAL);
      ?column?
---------------------
 2022-02-28 00:00:00
(1 row)

postgres=# select cast('2020/2/29' as date) + cast('-2 years' as INTERVAL);
      ?column?
---------------------
 2018-02-28 00:00:00
(1 row)

postgres=#

Excel

ところが、Microsoft Excelの場合は違います。
例えば、DATE関数を使用して、A1セルが2020年2月29日の時

=DATE(YEAR(A1)+2,MONTH(A1),DAY(A1))

2022年3月1日となります。なお、2年前は2018年3月1日となります。
ところが、

=EDATE(A1,24)

の場合は、MySQLと同様、 2020年2月29日 の2年後は 2022年2月28日 になります。2年前も同様に 2018年2月28日 になります。

おわりに

日付の処理の例外的パターンを調べてみました。使う処理系や関数によって結果が変わるので注意が必要だなと改めて思いました。

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

AWS RDS(mysql)のメジャーバージョンアップでパフォーマンス劣化にハマった話

先日、某運用サービス環境(商用です...)のデータベース(MySQL)のバージョン5.5がサポート終了なる死刑宣告を受け急遽、エンジンのメジャーバージョンアップを行うこととなりました。

商用サービスですので、まずは軽く各メジャーバージョンの仕様変更ポイントを確認、検証向けの環境で予行演習と動作検証を行いました。

疎通と端末アプリに特異動作はみられず、DBのバイタルにも特に問題が見られなかったため、商用適用作業は完了。

しかし数日後、特定の画面表示タイミングで大幅なパフォーマンス劣化が報告され調査開始。

サーバモジュール、端末アプリ双方には特段異常を確認できず、クラウド上の管理コンソールに出力されるスロークエリにも特に出力なし...

念のためDBにターミナル接続しスロークエリを直接確認したところ、ポロポロと軒並み5秒以上コストがかかっているクエリを特定しました。
実行計画をexplainコマンドで確認すると、インデックスの使われ方、結合順に以前と明らかな差分。
テーブルのデータ断片化解消や統計情報の再計算にとる実行計画の変化、そもそものインデックスの貼り方などをチェック、検証しました。

参考)https://techblog.yahoo.co.jp/entry/2020052530001949/

そうこうしても実行計画には特に変化なし、、そしてオプティマイザ周りの情報を収集しているうちに、、見つけました ... optimizer_switch の 「condition_fanout_filter」と「deriverd_merge」。

https://vidaisuki.hatenablog.com/entry/mysqlcasualadventcalendar20171213

結論)インデックスの貼り方、表の結合方法、オプティマイザ周りの仕様変更には気をつけて。

以上です。

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

AWS EC2上でMySQLクライアント5.7をインストールし、RDSに接続する

AWSでのデプロイ作業についての学習中、別途AWSで作成したRDSの中身を見ようとしたものの標準では見る方法が見当たらない
そのため、EC2上にMySQLをインストールする必要があった。

もともとAmazon Linux2には標準としてMariaDBというMySQL互換のデータベースサーバーがデフォルトでインストールされている。
しかし今回はそちらを使用しない。

今回はRDSでMySQLを作成した際に、情報量の多さを理由として5.7を選択している。

環境

・MacOS Big Sur11.1
・Amazom Linux2
・RDS MySQL5.7(エンジンバージョン5.7.31)

前提

ターミナルからEC2にSSH接続している

MySQLを追加する

コマンド

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

入力後

読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
mysql80-community-release-el7-3.noarch.rpm                                                                                                      |  25 kB  00:00:00     
/var/tmp/yum-root-UE3j_l/mysql80-community-release-el7-3.noarch.rpm を調べています: mysql80-community-release-el7-3.noarch
/var/tmp/yum-root-UE3j_l/mysql80-community-release-el7-3.noarch.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mysql80-community-release.noarch 0:el7-3 を インストール
--> 依存性解決を終了しました。
amzn2-core/2/x86_64                                                                                                                             | 3.7 kB  00:00:00     
amzn2extra-docker/2/x86_64                                                                                                                      | 3.0 kB  00:00:00     

依存性を解決しました

=======================================================================================================================================================================
 Package                                       アーキテクチャー           バージョン                 リポジトリー                                                 容量
=======================================================================================================================================================================
インストール中:
 mysql80-community-release                     noarch                     el7-3                      /mysql80-community-release-el7-3.noarch                      31 k

トランザクションの要約
=======================================================================================================================================================================
インストール  1 パッケージ

合計容量: 31 k
インストール容量: 31 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : mysql80-community-release-el7-3.noarch                                                                                                 1/1 
  検証中                  : mysql80-community-release-el7-3.noarch                                                                                                 1/1 

インストール:
  mysql80-community-release.noarch 0:el7-3                                                                                                                             

完了しました!

標準の状態だと8.0がインストールされるので、設定を5.7に変更する

disable = 無効にする

sudo yum-config-manager --disable mysql80-community

enable = 有効にする

sudo yum-config-manager --enable mysql57-community

MySQLクライアントのインストール

コマンド

sudo yum install -y mysql-community-client

入力後

読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
mysql-connectors-community                                                                                                                      | 2.6 kB  00:00:00     
mysql-tools-community                                                                                                                           | 2.6 kB  00:00:00     
mysql57-community                                                                                                                               | 2.6 kB  00:00:00     
mysql57-community/x86_64/primary_db                                                                                                             | 247 kB  00:00:00     
37 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mysql-community-client.x86_64 0:5.7.32-1.el7 を インストール
--> 依存性の処理をしています: mysql-community-libs(x86-64) >= 5.7.9 のパッケージ: mysql-community-client-5.7.32-1.el7.x86_64
--> 依存性の処理をしています: libncurses.so.5()(64bit) のパッケージ: mysql-community-client-5.7.32-1.el7.x86_64
--> 依存性の処理をしています: libtinfo.so.5()(64bit) のパッケージ: mysql-community-client-5.7.32-1.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ mariadb-libs.x86_64 1:5.5.68-1.amzn2 を 不要
--> 依存性の処理をしています: libmysqlclient.so.18()(64bit) のパッケージ: 2:postfix-2.10.1-6.amzn2.0.3.x86_64
--> 依存性の処理をしています: libmysqlclient.so.18(libmysqlclient_18)(64bit) のパッケージ: 2:postfix-2.10.1-6.amzn2.0.3.x86_64
---> パッケージ mysql-community-libs.x86_64 0:5.7.32-1.el7 を 非推奨
--> 依存性の処理をしています: mysql-community-common(x86-64) >= 5.7.9 のパッケージ: mysql-community-libs-5.7.32-1.el7.x86_64
---> パッケージ ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ mysql-community-common.x86_64 0:5.7.32-1.el7 を インストール
---> パッケージ mysql-community-libs-compat.x86_64 0:5.7.32-1.el7 を 非推奨
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================================================================================================
 Package                                         アーキテクチャー           バージョン                                     リポジトリー                           容量
=======================================================================================================================================================================
インストール中:
 mysql-community-client                          x86_64                     5.7.32-1.el7                                   mysql57-community                      25 M
 mysql-community-libs                            x86_64                     5.7.32-1.el7                                   mysql57-community                     2.3 M
     mariadb-libs.x86_64 1:5.5.68-1.amzn2 を入れ替えます
 mysql-community-libs-compat                     x86_64                     5.7.32-1.el7                                   mysql57-community                     1.2 M
     mariadb-libs.x86_64 1:5.5.68-1.amzn2 を入れ替えます
依存性関連でのインストールをします:
 mysql-community-common                          x86_64                     5.7.32-1.el7                                   mysql57-community                     308 k
 ncurses-compat-libs                             x86_64                     6.0-8.20170212.amzn2.1.3                       amzn2-core                            308 k

トランザクションの要約
=======================================================================================================================================================================
インストール  3 パッケージ (+2 個の依存関係のパッケージ)

総ダウンロード容量: 29 M
Downloading packages:
警告: /var/cache/yum/x86_64/2/mysql57-community/packages/mysql-community-common-5.7.32-1.el7.x86_64.rpm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID 5072e1f5: NOKEY
mysql-community-common-5.7.32-1.el7.x86_64.rpm の公開鍵がインストールされていません
(1/5): mysql-community-common-5.7.32-1.el7.x86_64.rpm                                                                                           | 308 kB  00:00:00     
(2/5): mysql-community-libs-5.7.32-1.el7.x86_64.rpm                                                                                             | 2.3 MB  00:00:00     
(3/5): ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64.rpm                                                                                  | 308 kB  00:00:00     
(4/5): mysql-community-client-5.7.32-1.el7.x86_64.rpm                                                                                           |  25 MB  00:00:00     
(5/5): mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm                                                                                      | 1.2 MB  00:00:00     
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                    68 MB/s |  29 MB  00:00:00     
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql から鍵を取得中です。
Importing GPG key 0x5072E1F5:
 Userid     : "MySQL Release Engineering <mysql-build@oss.oracle.com>"
 Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5
 Package    : mysql80-community-release-el7-3.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : mysql-community-common-5.7.32-1.el7.x86_64                                                                                             1/6 
  インストール中          : mysql-community-libs-5.7.32-1.el7.x86_64                                                                                               2/6 
  インストール中          : ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64                                                                                    3/6 
  インストール中          : mysql-community-client-5.7.32-1.el7.x86_64                                                                                             4/6 
  インストール中          : mysql-community-libs-compat-5.7.32-1.el7.x86_64                                                                                        5/6 
  削除中                  : 1:mariadb-libs-5.5.68-1.amzn2.x86_64                                                                                                   6/6 
  検証中                  : ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64                                                                                    1/6 
  検証中                  : mysql-community-client-5.7.32-1.el7.x86_64                                                                                             2/6 
  検証中                  : mysql-community-libs-compat-5.7.32-1.el7.x86_64                                                                                        3/6 
  検証中                  : mysql-community-libs-5.7.32-1.el7.x86_64                                                                                               4/6 
  検証中                  : mysql-community-common-5.7.32-1.el7.x86_64                                                                                             5/6 
  検証中                  : 1:mariadb-libs-5.5.68-1.amzn2.x86_64                                                                                                   6/6 

インストール:
  mysql-community-client.x86_64 0:5.7.32-1.el7          mysql-community-libs.x86_64 0:5.7.32-1.el7          mysql-community-libs-compat.x86_64 0:5.7.32-1.el7         

依存性関連をインストールしました:
  mysql-community-common.x86_64 0:5.7.32-1.el7                                  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3                                 

置換:
  mariadb-libs.x86_64 1:5.5.68-1.amzn2                                                                                                                                 

完了しました!

MySQLのバージョンを確認

コマンド

mysql --version

入力後

mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

RDSに接続する

コマンド

mysql -h 'エンドポイント' -u 'ユーザー名' -p

その後、パスワードを入力する

Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2006
Server version: 5.7.31 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 
mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| newdatabase  |     |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

無事ログインできれば完了。
ローカルで操作するように、MySQLコマンドによって操作できる。

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

dockerでmysqlが立ち上がらなくなった。

問題点

dockerで開発しようと、docker compose up -dしようとしたら、こんなのが出た。

failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to authorize: failed to fetch anonymous token: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fmysql%3Apull&service=registry.docker.io: net/http: TLS handshake timeout

解決方法

こちらで直りました。

docker-compose build --no-cache
docker compose up -d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL基本構文一覧

<使用環境>

  • macbook air (2020 M1)

<開発環境>

  • homebrew (homebrew 2.6.2)
  • MySQL (mysql Ver 14.14 Distrib 5.7.32, for osx10.16 (x86_64) using EditLine wrapper)
  • ターミナルを使用

<基本構文一覧>

データーベース作成(CREATE DATABASE)
CREATE DATABASE DB名;
データーベース削除(DROP DATEBASE)
CREATE DATABASE DB名;
テーブル作成(CREATE TABLE)
CREATE TABLE テーブル名 (フィールド名1 データ型,フィールド名2 データ型...);
テーブルの削除(DROP TABELE)
DROP TABLE テーブル名;
データの挿入(INSERT)
INSERT INTO テーブル名 (値1,値2,値3...)
データの検索(SELECT)
SELECT カラム名1,カラム名2... FROM テーブル名
カラム名に「*」を使用する事で全データを取得
データの更新(UPDATE)
UPADATE テーブル名 SET カラム名=更新したい値 WHERE 条件;
データの削除(DELETE)
DELETE FROM テーブル名 where 条件;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースのDate型に日付のみを保存するときの年数には9999ではなく8888を使おう

例えば、ユーザの誕生日をデータベースに追加するを想定します。

この場合MySQL等ではDate型を使用すると思いますが、誕生日を設定していないユーザの誕生日は、9999-07-07のように保存することになるでしょう。

すると、JavaScriptではnew Date()したときに、nullの場合と区別がつけられます。

const dateFormatter = (string) => {
    const date = new Date(string)

    // 引数がnullの場合
    if (date.getFullYear() === 1970) {
        return null
    } else if (date.getFullYear() === 9999) {
        return format(date, 'M月 d日')
    } else {
        return `${format(date, 'y年 M月 d日')}${differenceInYears(new Date(), date)}歳)`
    }
}

dateFormatter('9999-7-7')
// 7月 7日
dateFormatter('2020-7-7')
// 2019年 7月 7日 (1歳)

しかし、このシステムでは、しばらくした後にエラーが発生します。

ユーザの誕生日が2月29日だったときです。

MySQLでは、9999-2-29という存在しない日付をDate型に挿入できません。

なので、8888-2-29のように、閏年をマジックナンバーにしましょう、という話でした。

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