LoginSignup
1
2

More than 1 year has passed since last update.

PostgreSQL データをnode.jsで挿入してみる

Last updated at Posted at 2022-02-01

目次

  • 目的
  • 導入
  • プログラムの作成
  • つまづいた点
  • 参考文献

1.目的

  • 前回はユーザのラインでの問い合わせに対してPostgreSQLのデータを取得し、送信してくれるようなシステムがあればいいなということで作りました。

  • 今回は値を挿入するプログラムを作成していきたいと思います。

  • 家の温度や湿度をセンサで取得し、その値をPostgreSQLに格納する。←今回はここ
    その後、家の外からでも家の中の状態をラインで把握できるといった応用例があります←前回はここ

2. 導入

  • 前回の記事でユーザからのLINEメッセージに対して、適したデータをPostgreSQLから取得し、送信するといったことをpythonで実装しました。先にそちらの記事をお読みいただいた方が理解がスムーズかと思います。herokuやPostgreSQLを初めて使うという方もお読みください。

※プログラムは一例として作っています。また、今回はプログラムの一部抜粋して掲載しております。

  • データベースの要素は
    id | time | temp | hum
    となっていて、idは主キーとして設定しており、テーブル名はtableです。

3. プログラムの作成

node.js
require('pg').defaults.ssl = true; //SSLエラー解消のため
const { Pool } = require('pg')
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; //証明書エラーのため

const pool = new Pool({ //herokuサイト内のPostgreSQLの情報
    user: '',
    host: '',
    database: '',
    password: '',
    port: 5432,
})


async function postgresql_connect(temp,hum){
	const sqltime="SET TIME ZONE 'Asia/Tokyo'"
	const sql = "INSERT INTO table (time,temp,hum) VALUES (current_timestamp, $1, $2)"
	const sql_count = "SELECT COUNT(*) FROM table"
	const sql_del ="DELETE FROM table"
	const values = [temp, hum]
	try {
		await pool.query(sqltime)
		const result = await pool.query(sql, values)
		const result_count = await pool.query(sql_count)
        console.log(result)
		count=result_count.rows[0].count //何行あるかの数値

		if(count>9500){ //PostgreSQLの1万行問題の対策
            await pool.query(sql_del)
        }

	}	catch (e) {
			console.error(e)
		}

}

postgresql_connect(temp,hum); //センサ情報を関数へ

4. つまづいた点

  • クエリを短期間で何度も実行する場合、接続プールを使わないといけない点。

  • SSL関連でのエラーが多かった。

    • 調べると情報が多く出てきたので解決できました。
  • SELECT COUNT(*) FROM tableで得られた行数を変数に入れるのが少し時間がかかった。

    • rows[0].countで数値のみ抽出できました。

5. 参考文献

[参考にさせていただいたサイト]

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2