Categorygithub.com/guoapeng/gdbcTemplate
repository
1.5.5
Repository: https://github.com/guoapeng/gdbctemplate.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

readme file

a lightweight golang ORM framework similar to jdbc in java tech stack

currently the module support connecting db in mysql driver and PostgreSQL driver.

introduction

this is a go package to connect kinds of database using template approach.

usage

install dependencies

go get github.com/guoapeng/props v1.1.2
go get github.com/guoapeng/gdbcTemplate

prepare config.properties unser OS user home directory

for mysql


DRIVER_NAME=mysql
USERNAME=username
PASSWORD=your_pass
NETWORK=tcp
SERVER=localhost
PORT=3306
DATABASE=database_name
CHARSET=utf8mb4

in case you are using postgresql, prepare config.properties as below


DRIVER_NAME=pgx
USERNAME=postgres
PASSWORD=your_pass
NETWORK=tcp
SERVER=localhost
PORT=5432
DATABASE=database_name
CHARSET=utf8

import (
    "github.com/guoapeng/gdbcTemplate/template"
    "github.com/guoapeng/props"
)

// sql for postgresql
const SqlUser001 = `select USER_ID,
    USER_NAME,
    NICKNAME,
    PASSWORD,
    USER_TYPE,
    DESCRIPTION
    from USER
    where USER_NAME=$1`

const SqlUser002 = `select USER_ID,
    USER_NAME,
    NICKNAME,
    PASSWORD,
    USER_TYPE,
    DESCRIPTION
    from USER
    where USER_TYPE=$1`

const SqlUser003 = "insert into USER(USER_NAME, NICKNAME, CREATE_DATE, UPDATE_DATE, USER_TYPE)" +
        "values($1, $2, $3, current_date, current_date, 'admin' );"

func main() {

    var err error

    if AppConfig, err = propsReader.NewFactory("application", "config.properties").New(); err != nil {
        zap.S().Fatal("failed to load mandatory properties")
        panic(err)
    }

    gdbcTemplate = template.New(AppConfig)

    // insert without transaction
    result, err = gdbcTemplate.Update(SqlUser003, username, nickname)

    // or insert with transaction
    tx, err := gdbcTemplate.BeginTx()
    result, err = tx.Update(sqlfile.SqlUser003, username, nickname)

    if err != nil {
        tx.Rollback()
        zap.S().Error("ERROR: failed to create user", err)
        return "", fmt.Errorf("failed to create user")
    }

    // query single row
    user := gdbcTemplate.QueryRow(SqlUser001, userName)
    .Map(UserMapper)
    .ToObject()

    // in somce cases, we need to query data thata not commited through transaction,
    // we can do that like the following
    user := tx.QueryRow(SqlUser001, userName)
        .Map(UserMapper)
        .ToObject()

   // query multiple rows
   users := gdbcTemplate.QueryForArray(SqlUser002)
    .Map(mapper.UserRowsMapper, userType).ToArray()

   // query multiple rows within transaction
   users := tx.QueryForArray(SqlUser002)
    .Map(mapper.UserRowsMapper, userType).ToArray()

    tx.Commit()


}

func UserMapper(row *sql.Row) interface{} {
    user := new(domain.User)
    _ = rows.Scan(&user.UserId,
        &user.UserName,
        &user.Nickname,
        &user.Password,
        &user.UserType,
        &user.Description))
    _ = row.Scan(&domainobj.UserId, &domainobj.MemoTarget)

    return user
}

func UserRowsMapper(rows *sql.Rows) interface{} {
    user := new(domain.User)
    _ = rows.Scan(&user.UserId,
        &user.UserName,
        &user.Nickname,
        &user.Password,
        &user.UserType,
        &user.Description)
    return user
}

development guide

build the go files

# user project root
go build datasource/datasource.go
go build mapper/rowsmapper.go
go build template/gdbcTemplate.go

# or 

go build ./...

run test


go test template/gdbcTemplate_test.go
go test transaction/transaction_test.go
go test datasource/dbManager_test.go

# or

go test ./...

generate mock class

generate mock classes with testify


# install mockery

cd <project_home>
go install github.com/vektra/mockery/[email protected]

cd <project_home>
go get github.com/stretchr/testify/mock
go get github.com/vektra/mockery/.../

cd <project_home>
# generate mock structs
mockery --recursive --name "GdbcTemplate|RowMapper|RowsMapper|Transaction|DataSource|ConnManager"

mockery -r -all

publish

create tag

    git tag v1.x.x

upload tag to the repository

    git push origin --tags

todo list

  1. remove dependency on github.com/guoapeng/props to only rely on sql.datasource
  2. support sqlite

trouble shooting

  1. cannot find module in case you encountered the issue:
   $ go build
   build .: cannot find module for path .

solution: replace the go build command like

go build mapper/rowsmapper.go

# or
go build ./...