gforge
ginger-forge
forked from caibirdme/gforge,
- it is a cli tool based on gendry, it generates golang struct according to the table name which could ease your burden. Even it can generate the complete DAO layer for you.
- Different with caibirdme/gforge,
ginger-forge
will generate the source code into go file.
install
go get -u github.com/gofuncchan/ginger-forge
usage
> forge -h
A collection of tools to generate code for operating database supported by Gendry
Options:
-h, --help display help information
-v version
Commands:
help display help information
schema schema could generate go struct code for given table
dao dao generates code of dao layer by given table name
Get the subcommand help information
> forge help schema
schema could generate go struct code for given table
Options:
-d database name
-t table name
-u user name
-p password
-h[=localhost] host
-P[=3306] port
Generate a go struct for table
> forge table -uusername -ppassword -hip -dinformation_schema -tCOLUMNS
// COLUMNS is a mapping object for COLUMNS
type COLUMNS struct {
TABLECATALOG string `json:"TABLE_CATALOG"
TABLESCHEMA string `json:"TABLE_SCHEMA"
TABLENAME string `json:"TABLE_NAME"
COLUMNNAME string `json:"COLUMN_NAME"
ORDINALPOSITION uint64 `json:"ORDINAL_POSITION"
COLUMNDEFAULT string `json:"COLUMN_DEFAULT"
ISNULLABLE string `json:"IS_NULLABLE"
DATATYPE string `json:"DATA_TYPE"
CHARACTERMAXIMUMLENGTH uint64 `json:"CHARACTER_MAXIMUM_LENGTH"
CHARACTEROCTETLENGTH uint64 `json:"CHARACTER_OCTET_LENGTH"
NUMERICPRECISION uint64 `json:"NUMERIC_PRECISION"
NUMERICSCALE uint64 `json:"NUMERIC_SCALE"
DATETIMEPRECISION uint64 `json:"DATETIME_PRECISION"
CHARACTERSETNAME string `json:"CHARACTER_SET_NAME"
COLLATIONNAME string `json:"COLLATION_NAME"
COLUMNTYPE string `json:"COLUMN_TYPE"
COLUMNKEY string `json:"COLUMN_KEY"
EXTRA string `json:"EXTRA"
PRIVILEGES string `json:"PRIVILEGES"
COLUMNCOMMENT string `json:"COLUMN_COMMENT"
GENERATIONEXPRESSION string `json:"GENERATION_EXPRESSION"
}
The produced struct could pass the examine of golint and govet
Generate codes of dao layer about one table
> gforge dao -uusername -ppassword -hip -dinformation_schema -tCOLUMNS | gofmt
package COLUMNS
import (
"database/sql"
"errors"
"github.com/didichuxing/gendry/builder"
"github.com/didichuxing/gendry/scanner"
)
/*
This code is generated by ddtool
*/
// COLUMNS is a mapping object for COLUMNS
type COLUMNS struct {
TABLECATALOG string `json:"TABLE_CATALOG"`
TABLESCHEMA string `json:"TABLE_SCHEMA"`
TABLENAME string `json:"TABLE_NAME"`
COLUMNNAME string `json:"COLUMN_NAME"`
ORDINALPOSITION uint64 `json:"ORDINAL_POSITION"`
COLUMNDEFAULT string `json:"COLUMN_DEFAULT"`
ISNULLABLE string `json:"IS_NULLABLE"`
DATATYPE string `json:"DATA_TYPE"`
CHARACTERMAXIMUMLENGTH uint64 `json:"CHARACTER_MAXIMUM_LENGTH"`
CHARACTEROCTETLENGTH uint64 `json:"CHARACTER_OCTET_LENGTH"`
NUMERICPRECISION uint64 `json:"NUMERIC_PRECISION"`
NUMERICSCALE uint64 `json:"NUMERIC_SCALE"`
DATETIMEPRECISION uint64 `json:"DATETIME_PRECISION"`
CHARACTERSETNAME string `json:"CHARACTER_SET_NAME"`
COLLATIONNAME string `json:"COLLATION_NAME"`
COLUMNTYPE string `json:"COLUMN_TYPE"`
COLUMNKEY string `json:"COLUMN_KEY"`
EXTRA string `json:"EXTRA"`
PRIVILEGES string `json:"PRIVILEGES"`
COLUMNCOMMENT string `json:"COLUMN_COMMENT"`
GENERATIONEXPRESSION string `json:"GENERATION_EXPRESSION"`
}
//GetOne gets one record from table COLUMNS by condition "where"
func GetOne(db *sql.DB, where map[string]interface{}) (*COLUMNS, error) {
if nil == db {
return nil, errors.New("sql.DB object couldn't be nil")
}
cond, vals, err := builder.BuildSelect("COLUMNS", where, nil)
if nil != err {
return nil, err
}
row, err := db.Query(cond, vals...)
if nil != err || nil == row {
return nil, err
}
defer row.Close()
var res *COLUMNS
err = scanner.Scan(row, &res)
return res, err
}
//GetMulti gets multiple records from table COLUMNS by condition "where"
func GetMulti(db *sql.DB, where map[string]interface{}) ([]*COLUMNS, error) {
if nil == db {
return nil, errors.New("sql.DB object couldn't be nil")
}
cond, vals, err := builder.BuildSelect("COLUMNS", where, nil)
if nil != err {
return nil, err
}
row, err := db.Query(cond, vals...)
if nil != err || nil == row {
return nil, err
}
defer row.Close()
var res []*COLUMNS
err = scanner.Scan(row, &res)
return res, err
}
//Insert inserts an array of data into table COLUMNS
func Insert(db *sql.DB, data []map[string]interface{}) (int64, error) {
if nil == db {
return nil, errors.New("sql.DB object couldn't be nil")
}
cond, vals, err := builder.BuildInsert("COLUMNS", data)
if nil != err {
return 0, err
}
result, err := db.Exec(cond, vals...)
if nil != err || nil == result {
return 0, err
}
return result.LastInsertId()
}
//Update updates the table COLUMNS
func Update(db *sql.DB, where, data map[string]interface{}) (int64, error) {
if nil == db {
return 0, errors.New("sql.DB object couldn't be nil")
}
cond, vals, err := builder.BuildUpdate("COLUMNS", where, data)
if nil != err {
return 0, err
}
result, err := db.Exec(cond, vals...)
if nil != err {
return 0, err
}
return result.RowsAffected()
}
// Delete deletes matched records in COLUMNS
func Delete(db *sql.DB, where,data map[string]interface{}) (int64, error) {
if nil == db {
return 0, errors.New("sql.DB object couldn't be nil")
}
cond,vals,err := builder.BuildDelete("{{.TableName}}", where)
if nil != err {
return 0, err
}
result,err := db.Exec(cond, vals...)
if nil != err {
return 0, err
}
return result.RowsAffected()
}