golangで時刻(time)情報を生成して、その情報をpostgresqlに格納して、さらに読み出す実験

/*

golangで時刻(time)情報を生成して、その情報をpostgresqlに格納して、さらに読み出す実験

テスト用DB環境の作り方

C:\Users\ebata>psql -U postgres -p 15432
Password for user postgres:
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.

postgres=# create database agent_db;
CREATE DATABASE

postgres-# \c agent_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "agent_db" as user "postgres".

agent_db-# create table LocMessage(
agent_db(# ID     int,
agent_db(# dt     timestamp,
agent_db(# Lat    double precision,
agent_db(# Lng    double precision,
agent_db(# TYPE   varchar(10),
agent_db(# POPUP  int
agent_db(# );

agent_db=# \dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | locmessage | table | postgres
(1 row)


agent_db=# select * from locmessage;
 id | dt | lat | lng | type | popup
----+----+-----+-----+------+-------
(0 rows)

と、まあ、こんな感じ

*/

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/lib/pq" // ←これを追記
)

func main() {

	db, err := sql.Open("postgres",
		"user=postgres password=password host=localhost port=15432 dbname=agent_db sslmode=disable")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer db.Close()

	ins, err := db.Prepare("insert into locmessage(id,dt,lat,lng,type,popup) VALUES($1,$2,$3,$4,$5,$6)")
	if err != nil {
		log.Fatal("db.Exec Error: ", err)
	}

	a := 1
	b := time.Now()
	c := 139.02
	d := 38.02
	e := 1
	f := 1

	ins.Exec(a, b, c, d, e, f)

	///// 書き込みここまで
	// 書き込まれたデータはこんな感じになっている (2回プログラムを実施)
	/*
		agent_db=# select * from locmessage;
		 id |             dt             |  lat   |  lng  | type | popup
		----+----------------------------+--------+-------+------+-------
		  1 | 2022-09-15 23:54:36.877274 | 139.02 | 38.02 | 1    |     1
		  1 | 2022-09-15 23:55:16.574776 | 139.02 | 38.02 | 1    |     1
		(2 rows)
	*/
	// さて、このDBからどうやって、時間情報を取り出すか?

	rows, err := db.Query("select dt from locmessage")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var dt time.Time

	for rows.Next() {
		if err := rows.Scan(&dt); err != nil {
			fmt.Println(err)
		}

		fmt.Println(dt)

		// 出力結果が、こんな感じになって、ちょっと変 "+0000 +0000"は、いらん
		/*
			2022-09-15 23:54:36.877274 +0000 +0000
			2022-09-15 23:55:16.574776 +0000 +0000
			2022-09-16 00:06:18.870051 +0000 +0000
			2022-09-16 00:12:51.251972 +0000 +0000
			.....
			2022-09-16 13:57:46.704896 +0000 +0000
		*/

		// こんな感じにすれば、整数などでデータ取り出せる
		fmt.Println(dt.Date())   // e.g 2022 September 16
		fmt.Println(dt.Clock())  // 13 57 46
		fmt.Println(dt.Minute()) // 57
		fmt.Println(dt.Hour())   // 13
		fmt.Println(dt.Day())    // 16

	}

}

こんだけのことがやりたかっただけなのに、"golang" "postgresql", "timestamp", "time.Time"で検索しても、ドンピシャの情報が出てこないんですよ、不思議なことに。

2022/09,江端さんの技術メモ

Posted by ebata