setup database done
parent
a2196f975e
commit
9f272786c6
@ -0,0 +1,31 @@
|
||||
CREATE DATABASE test;
|
||||
CREATE SCHEMA custom;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS custom.main (
|
||||
user_id VARCHAR (50) PRIMARY KEY,
|
||||
pass VARCHAR (256) NOT NUll,
|
||||
del_flag BOOLEAN default FALSE,
|
||||
description VARCHAR(50),
|
||||
cre_id VARCHAR (50) NOT NULL,
|
||||
cre_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
mod_id VARCHAR (50) NOT NULL,
|
||||
mod_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
mod_ts INT NOT NULL
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION custom.trigger_set_timestamp()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.mod_time = now();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE TRIGGER set_timestamp
|
||||
BEFORE UPDATE ON custom.main
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE custom.trigger_set_timestamp();
|
||||
|
||||
INSERT INTO custom.main (user_id, pass, cre_id, mod_id, mod_ts) VALUES ('abc', 'password', 1, 1, 1);
|
||||
SELECT * FROM custom.main;
|
||||
UPDATE custom.main SET pass = 'pass', mod_ts = 3;
|
@ -0,0 +1,74 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/ajikamaludin/go-grpc_basic/pkg/v1/utils/constants"
|
||||
"github.com/ajikamaludin/go-grpc_basic/pkg/v1/utils/converter"
|
||||
)
|
||||
|
||||
type CustomMain struct {
|
||||
UserId string `db:"user_id,omitempty"`
|
||||
Pass string `db:"pass,omitempty"`
|
||||
DelFlag bool `db:"del_flag,omitempty"`
|
||||
Description sql.NullString `db:"description,omitempty"`
|
||||
CreId string `db:"cre_id,omitempty"`
|
||||
CreTime time.Time `db:"cre_time,omitempty"`
|
||||
ModId string `db:"mod_id,omitempty"`
|
||||
ModTime time.Time `db:"mod_time,omitempty"`
|
||||
ModTs int `db:"mod_td,omitempty"`
|
||||
}
|
||||
|
||||
func (c *Conn) CustomMainSelect(filter *CustomMain) ([]*CustomMain, error) {
|
||||
//create query syntax
|
||||
qsyntax := fmt.Sprintf(`SELECT * FROM %s`, constants.Table_Custom_Main)
|
||||
|
||||
fil := reflect.ValueOf(*filter)
|
||||
|
||||
for i := 0; i < fil.NumField(); i++ {
|
||||
if !fil.Field(i).IsZero() {
|
||||
if i == 0 {
|
||||
qsyntax = fmt.Sprintf(`%s WHERE`, qsyntax)
|
||||
}
|
||||
qsyntax = fmt.Sprintf(`%s %s = '%v'`, qsyntax, converter.CamelToSnakeCase(fil.Type().Field(i).Name), fil.Field(i))
|
||||
}
|
||||
}
|
||||
|
||||
qsyntax = strings.TrimRight(qsyntax, "AND")
|
||||
qsyntax = fmt.Sprintf(`%s;`, qsyntax)
|
||||
|
||||
fmt.Println(qsyntax)
|
||||
db, err := sql.Open(POSTGRES, c.Conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := db.Query(qsyntax)
|
||||
defer db.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer rows.Close()
|
||||
|
||||
var rowsScanArr []*CustomMain
|
||||
|
||||
for rows.Next() {
|
||||
var rowsScan CustomMain
|
||||
err := rows.Scan(&rowsScan.UserId, &rowsScan.Pass,
|
||||
&rowsScan.DelFlag, &rowsScan.Description, &rowsScan.CreId,
|
||||
&rowsScan.CreTime, &rowsScan.ModId, &rowsScan.ModTime, &rowsScan.ModTs)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rowsScanArr = append(rowsScanArr, &rowsScan)
|
||||
}
|
||||
|
||||
return rowsScanArr, nil
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"github.com/ajikamaludin/go-grpc_basic/pkg/v1/config"
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
const (
|
||||
POSTGRES string = "postgres"
|
||||
)
|
||||
|
||||
type Conn struct {
|
||||
Conn string
|
||||
}
|
||||
|
||||
func New(config *config.Config) (*Conn, error) {
|
||||
conn := fmt.Sprintf("host=%v port=%v user=%v password=%v dbname=%v sslmode=disable",
|
||||
config.Postgres.Host,
|
||||
config.Postgres.Port,
|
||||
config.Postgres.Username,
|
||||
config.Postgres.Password,
|
||||
config.Postgres.Dbname)
|
||||
db, err := sql.Open(POSTGRES, conn)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = db.Ping()
|
||||
defer db.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Conn{
|
||||
Conn: conn,
|
||||
}, nil
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package converter
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func CamelToSnakeCase(str string) string {
|
||||
var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
|
||||
var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
|
||||
|
||||
snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}")
|
||||
snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
|
||||
|
||||
return strings.ToLower(snake)
|
||||
}
|
Loading…
Reference in New Issue