/*
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"で検索しても、ドンピシャの情報が出てこないんですよ、不思議なことに。