第7話 ユーザーデータベースの構築
こんにちは!Kenです。
今回はSQLによるデータベース構築を学んでいきたいと思います。
SQLの基礎は以下のページが参考になるかと思います。
Postgresアドオンの追加
Herokuではアプリに様々なアドオン(拡張機能)を追加できます。その1つにPostgreSQLがあります。今回はこちらを使います。
herokuで今回のBOTアプリを選択して、Resourcesタブを開き、Find more addonsをクリックします。
たくさんアドオンが出てくるかと思いますが、Heroku Postgresを選択します。
下の方に料金プランがありますが、Hobby Devが選択されていることを確認し、右側のInstall Heroku Postgresをクリックし、インストールします。
次の画面では、赤枠の欄にアプリ名を入力します。そして、そのアプリ名を選択してSubmit Order Formをクリックします。
これでアプリにHeroku Postgresがインストールされました。画像の下の方にHeroku Postgresが追加されていることがわかりますね。
このHeroku Postgresをクリックして開いてみましょう。SettingsタブのView Credentialsをクリックします。
開いたページに、次の5つの項目があるかと思います。後で、この5つの項目を使いますのでコピペできるようページを残しておきましょう。
■Host
■Database
■User
■Port
■Password
Postgresライブラリの追加
さて、Postgresをプログラムで扱うためにはライブラリの追加が必要です。VS Codeのターミナルで次のようにpgをインストールしましょう。
$ npm i pg --save
package.jsonのdependenciesにpgが追加されたことを確認します。
そして、index.jsで次のようにライブラリの読み込みを行います。
const { Client } = require('pg');
Postgersを使うための設定
それでは、プログラムでPostgresが使えるようにコーディングしていきましょう。
index.jsの頭の方に以下を追加します。
const connection = new Client({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});
connection.connect();
Postgresを使うためのパラメータ設定です。DATABASE_URLはHerokuにパラメータ設定をしなければならないのかな?と察しの良い方は思われるかもしれません。しかし、HerokuのアドオンにposgreSQLをインストールした時点でこのパラメータは自動で設定されているため、特に自分で何かをやるということは不要です。
これで、Postgresを使う準備は完了です。
データベースの作成
ではVS Codeでまずはデータベース作成のコードを書いていきましょう。
このアプリでは2つのデータベースが必要となります。
■顧客データベース
■予約データベース
SQLを操作するには独特のクエリ分を扱う必要があります。以下のページが大変参考になりましたので、必要に応じてこのページで調べながら進めると良いと思います。
今回は顧客データベースの作成を行います。
以下のクエリ文を用意します。
const create_userTable = {
text:'CREATE TABLE IF NOT EXISTS users (id SERIAL NOT NULL, line_uid VARCHAR(255), display_name VARCHAR(255), timestamp VARCHAR(255), cuttime SMALLINT, shampootime SMALLINT, colortime SMALLINT, spatime SMALLINT);'
};
顧客データを構成する項目は次の8項目です。
■id:固有の値。SERIALによって連続的に+1された値となっていく。
■line_uid:LINEのユーザーID
■display_name:LINEで表示される名前
■timestamp:友達登録された日時(timestamp)
■cuttime:カットに要する時間(分)
■shampootime:シャンプーに要する時間(分)
■colortime:カラーリングに要する時間(分)
■spatime:マッサージ&スパに要する時間(分)
このアプリでの特徴的なところは、各個人の施術時間を可変にしているところです。
以前、店主と話している時、一般の予約システムが使えない理由に、例えば同じカットでも人によってかかる時間が違うということがありました。
LINEであれば個人を特定することができるので、その人ごとの施術時間を設定してあげることができるのです!!
そしてこのクエリを実行するコードがこちらです。
connection.query(create_userTable)
.then(()=>{
console.log('table users created successfully!!');
})
.catch(e=>console.log(e));
ご覧の通り、データベース操作は非同期処理です。これは非常に重要ですので覚えておくようにしてください。
では、ここまできたらデプロイしてちゃんとデータベースが作られているか確認してみましょう。
いつものようにHerokuへデプロイします。
VS Codeのターミナルで以下を実行すると、ターミナル上でPostgresを操作することができます。
$ heroku pg:psql
さらに、データベースモードになったら、次のSELECT文を実行してみてください。
DATABASE=> select * from users;
これはusersというデータベースの全てを選択し、表示させる命令です。ちなみにこのデータベースモードから抜け出すコマンドは\qと入力し、Enterキーです。
さて、ターミナルに次のように表示されればテーブル作成成功です。
当然の事ながら、まだデータは何も入ってません。
では友達登録したら、データベースに顧客情報を登録するようにしましょう。
テーブルへの顧客情報登録
友達登録した時にデータベーステーブルへ追加ということは、follow_greeting( )関数の中にコーディングすれば良さそうですね。
テーブルへの追加は次の構文です。
const table_insert = {
text:'INSERT INTO users (line_uid,display_name,timestamp,cuttime,shampootime,colortime,spatime) VALUES($1,$2,$3,$4,$5,$6,$7);',
values:[ev.source.userId,profile.displayName,ev.timestamp,INITIAL_TREAT[0],INITIAL_TREAT[1],INITIAL_TREAT[2],INITIAL_TREAT[3]]
};
connection.query(table_insert)
.then(()=>{
console.log('insert successfully!!')
})
.catch(e=>console.log(e));
構文自体はCREATEと似てますよね。テーブルへのデータ追加はINSERT構文を使います。
さて、挿入文の中にINITIAL_TREATがあります。これは施術時間の初期値で、グローバル変数として定義してますので大文字にしてます。
const INITIAL_TREAT = [20,10,40,15,30,15,10]; //施術時間初期値
グローバル領域に宣言してあげましょう。単位は(分)です。左から、カット、シャンプー、カラーリング、ヘッドスパ、マッサージ&パック、顔そり、眉整えの施術時間となってます。
なぜカット、シャンプー、カラーリング、ヘッドスパだけデータベーステーブルにあるかというと、これらは人により施術時間が異なるため、後で店主が変更できるようにするためです。どのように変更するのかは、また後日。
これでコーディング完了ですので、herokuへデプロイしましょう。
友達登録時にテーブルへデータ追加されるか確認する
では早速データ追加がされるか試してみましょう。
先ほどのクエリ文は友達追加時しか実行されないため、LINEの友達リストから公式アカウントを削除しておきましょう。
エラーチェックするため、heroku logs --tailも忘れずに。
なお、heorku logs --tailから抜け出すためにはCtrl+Cです。
そして再びQRコードを読み込み友達追加します。
フォローありがとうのメッセージは来ましたでしょうか?
では、テーブルにデータ追加されたか確認してみましょう。
$ heroku pg:psql
でPostgresへ入ろうとしますが、初めてPostgresを使う方は以下のようなエラーが出てしまうこともあるかと思います。
The local psql command could not be located. For help installing psql, see
▸ https://devcenter.heroku.com/articles/heroku-postgresql#local-setup
おそらく、ローカル環境(PC)にpostgersがインストールされていないことが原因と思われます。
従いまして、ローカル環境へpostgresをインストールすることを考えます。
以下の記事が参考になります。
homebrewよりかはこちらでちゃんとインストールしてもらった方が良いかもしれません。
自分のPCがすでに環境構築できているので、環境構築を再現できないため、こういった環境構築系の話は結構難しい・・・
以下のようにテーブル追加できていれば成功です!!
では、今回はこの辺で終わりにします。
最後までお読みいただきましてありがとうございました。
少しでも参考になりましたら「スキ」をいただけると今後のモチベーションになりますのでぜひお願いします!!
MENTA でLINEBOT開発サポートをしております。お気軽にご相談ください。