- 投稿日:2020-12-23T23:52:25+09:00
【Nuxt.js】API(バックエンド)でMySQLからテーブル情報を取得しフロントエンドで表示させるアプリの作成
1 はじめに
【アプリ作成の目的】
フロントエンド(Nuxt.js),バックエンド(express)を利用したアプリ作成を理解する。フロントエンドとサーバーエンドを分離したアプリとする。【フロントエンドで行うこと】
・axiosを利用してバックエンド側(API)にリクエストを投げ、取得したデータを表示させる。
・ホームディレクトリは、「nuxt-scraping-app」とする。【バックエンドで行うこと】
・事前にスクレイピングしてMySQLに保存したデータをjsonで返すAPIを作成する。
・ホームディレクトリは、「api-nuxt-puppeteer」とする。【注意点】
※今回スクレイピング部分のコードに関しては、割愛させていただきます。
※スクレイピングの情報取得先はファッション系サイトであるfarfetchの商品を選択しました(sacaiのアイテム)。
※まだ理解が浅い為間違っている箇所はご指摘いただけると助かります!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.jsconst 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 5000をlistenする 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 axiosNuxtでは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でローカルでサーバーを実行させると、最初のように表示できるはずです。
- 投稿日:2020-12-23T23:52:25+09:00
【Nuxt.js】API(サーバーサイド)でMySQLからテーブル情報を取得しクライアントサイドで表示させる【Express】
1 はじめに
・APIアプリ(サーバーサイド)...MySQLに接続し、テーブルから情報を取得させます。
・フロントアプリ(クライアントサイド)... axiosによりlocalhost:5000に繋いでjsonで返してindex.vueに表示させます。上記をNuxt.jsにより作成し、ローカル環境でフロントアプリからaxiosにより情報取得し、表示させる。
※各種installコマンド等は省きます
※まだ理解が浅い為間違っている箇所はご指摘いただけると助かります!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.jsconst 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アプリ制作は今後デファクトスタンダードになっていくと思うので、インプットを更に励む必要がある。
- 投稿日:2020-12-23T19:21:09+09:00
[Node.js] Node.jsを用いてMySQLにデータを登録する
Node.jsを用いてMySQLにデータを登録する
※ 自分用の覚え書きでございます。
Node.jsを用いてMySQLにデータを登録します。ローカル環境で実行しています。
MySQLに作成したテーブル
f_id , f_name , f_age という3つのフィールドを作成しました。
Node.js側の記述
/ (localhostのルート) にアクセスしたとき、SELECT文を実行します。
/entry に post したとき、INSERT文を実行します。app.jsconst 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人登録されています。・新規登録をクリックすると入力フォームが表示されます。
→やまださぶろう さんを登録します。・登録をクリックすると入力されたデータが登録、表示されます。
→やまださぶろう さんが登録されました。
- 投稿日:2020-12-23T19:13:22+09:00
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日 になります。
おわりに
日付の処理の例外的パターンを調べてみました。使う処理系や関数によって結果が変わるので注意が必要だなと改めて思いました。
- 投稿日:2020-12-23T18:03:21+09:00
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
結論)インデックスの貼り方、表の結合方法、オプティマイザ周りの仕様変更には気をつけて。
以上です。
- 投稿日:2020-12-23T11:59:00+09:00
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-communityenable = 有効にする
sudo yum-config-manager --enable mysql57-communityMySQLクライアントのインストール
コマンド
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 wrapperRDSに接続する
コマンド
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コマンドによって操作できる。
- 投稿日:2020-12-23T11:51:10+09:00
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
- 投稿日:2020-12-23T10:03:40+09:00
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 条件;
- 投稿日:2020-12-23T05:23:26+09:00
データベースの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のように、閏年をマジックナンバーにしましょう、という話でした。





