sqlca

package module
v1.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 11, 2020 License: MIT Imports: 18 Imported by: 1

README

author

lory.li

email

civet148@126.com

QQ

93864947

sqlca

a enhancement database and cache tool based on sqlx and redigogo which based on redigo and go-redis-cluster

database schema

CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;

USE test;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `users`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'auto inc id',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
  `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `sex` tinyint(1) NOT NULL DEFAULT 1,
  `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `created_at` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0),
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, 'rose', '8613011112222', 2, 'rose123@hotmail.com', '2020-03-11 08:46:57', '2020-03-11 08:48:14');
INSERT INTO `users` VALUES (2, 'john', '8613100003333', 1, 'john333@hotmail.com', '2020-03-11 08:46:57', '2020-03-11 08:47:59');

SET FOREIGN_KEY_CHECKS = 1;

data model

type UserDO struct {
	Id    int32  `db:"id"`  
	Name  string `db:"name"`  
	Phone string `db:"phone"` 
	Sex   int8   `db:"sex"`   
	Email string `db:"email"` 
}

open database/redis


e := sqlca.NewEngine()
e.Debug(true) //debug mode on

// open database driver (requred)
e.Open("mysql://root:123456@127.0.0.1:3306/test?charset=utf8mb4")

// open redis driver for cache (optional)
e.Open("redis://127.0.0.1:6379/cluster?db=0", 3600) //redis standalone mode

global variants

const (
	TABLE_NAME_USERS = "users"
)

orm: insert/upsert from data model

user := UserDO{
        Name:  "admin",
        Phone: "8618600000000",
        Sex:   1,
        Email: "admin@golang.org",
}

e.Model(&user).Table(TABLE_NAME_USERS).Insert()
user := UserDO{
    Id:    1,
    Name:  "lory",
    Phone: "8618688888888",
    Sex:   2,
    Email: "lory@gmail.com",
}

e.Model(&user).Table(TABLE_NAME_USERS).Select("name", "phone", "email", "sex").Upsert()

orm: update from data model

user := UserDO{
    Name:  "john",
    Phone: "8618699999999",
    Sex:   1,
    Email: "john@gmail.com",
}

e.Model(&user).Table(TABLE_NAME_USERS).Id(1).Select("name", "phone", "email", "sex").Update()

orm: query results into data model

user := UserDO{}

// default 'select * from ...'
e.Model(&user).Table(TABLE_NAME_USERS).Id(1).Query()

// just select 'name' and 'phone' 
e.Model(&user).Table(TABLE_NAME_USERS).Id(1).Select("name", "phone").Query()

orm: query results into data model slice

var users []UserDO

// select id, name, phone from users limit 3
//e.Model(&user).Table(TABLE_NAME_USERS).Select("id", name", "phone").Limit(3).Query();

// select * from users limit 3
if rowsAffected, err := e.Model(&users).Table(TABLE_NAME_USERS).Limit(3).Query(); err != nil {
    log.Errorf("query into data model [%+v] error [%v]", users, err.Error())
} else {
    log.Debugf("query into model [%+v] ok, rows affected [%v]", users, rowsAffected)
}

orm: update from data model

user := UserDO{
    Id:    1, 
    Name:  "john",
    Phone: "8618699999999",
    Sex:   1,
    Email: "john@gmail.com",
}
//SQL: update users set name='john', phone='8618699999999', sex='1', email='john@gmail.com' where id='1'
if rowsAffected, err := e.Model(&user).Table(TABLE_NAME_USERS).Select("name", "phone", "email", "sex").Update(); err != nil {
    log.Errorf("update data model [%+v] error [%v]", user, err.Error())
} else {
    log.Debugf("update data model [%+v] ok, rows affected [%v]", user, rowsAffected)
}

raw: query results into data model

user := UserDO{}

//SQL: select * from users where id=1
if rowsAffected, err := e.Model(&user).QueryRaw("select * from users where id=?", 1); err != nil {
    log.Errorf("query into data model [%+v] error [%v]", user, err.Error())
} else {
    log.Debugf("query into model [%+v] ok, rows affected [%v]", user, rowsAffected)
}

raw: query results into data model slice

var users []UserDO

//SQL: select * from users where id < 5
if rowsAffected, err := e.Model(&users).QueryRaw("select * from %v where id < %v", TABLE_NAME_USERS, 5); err != nil {
    log.Errorf("query into data model [%+v] error [%v]", users, err.Error())
} else {
    log.Debugf("query into model [%+v] ok, rows affected [%v]", users, rowsAffected)
}

raw: query results into data model map[string]string slice


raw: exec without data model

//e.ExecRaw("UPDATE %v SET name='duck' WHERE id='%v'", TABLE_NAME_USERS, 2) //it will work well as question placeholder
rowsAffected, lasteInsertId, err := e.ExecRaw("UPDATE users SET name=? WHERE id=?", "duck", 1)
if err != nil {
    log.Errorf("exec raw sql error [%v]", err.Error())
} else {
    log.Debugf("exec raw sql ok, rows affected [%v] last insert id [%v]", rowsAffected, lasteInsertId)
}

save data to cache by id or index

just for orm [insert/upsert/update] and tx [update]


change primary key name

e.SetPkName("uuid")

use cache when orm query/update/insert/upsert


e := sqlca.NewEngine()
e.Debug(true) //debug mode on

// open database driver (requred)
e.Open("mysql://root:123456@127.0.0.1:3306/test?charset=utf8mb4")

// open redis driver for cache (requred)
e.Open("redis://127.0.0.1:6379/cluster?db=0", 3600) //redis standalone mode

user := UserDO{
    Id:    0, 
    Name:  "john",
    Phone: "8618699999999",
    Sex:   1,
    Email: "john@gmail.com",
}
e.Model(&user).Table(TABLE_NAME_USERS).Cache().Insert()

tx: orm and raw

user1 := UserDO{
    //Id:    0,
    Name:  "user1",
    Phone: "8618600000001",
    Sex:   1,
    Email: "user1@hotmail.com",
}

user2 := UserDO{
    //Id:    0,
    Name:  "user2",
    Phone: "8618600000002",
    Sex:   1,
    Email: "user2@hotmail.com",
}
tx1 := e.Model(&user1).Table(TABLE_NAME_USERS).ToTxInsert()
tx2 := e.Model(&user2).Table(TABLE_NAME_USERS).ToTxInsert()
if err := e.Tx(tx1, tx2); err != nil {
    log.Errorf("tx error [%v]", err.Error())
} else {
    log.Debugf("tx ok")
}
tx1 := "INSERT INTO users (`name`,`phone`,`sex`,`email`) VALUES ('user3','8618600000003','1','user3@hotmail.com')"
tx2 := "INSERT INTO users (`name`,`phone`,`sex`,`email`) VALUES ('user4','8618600000004','2','user4@hotmail.com')"

if err := e.TxRaw(tx1, tx2); err != nil {
    log.Errorf("tx raw error [%v]", err.Error())
} else {
    log.Debugf("tx raw ok")
}

index record to cache

user := UserDO{
    Id:    1,
    Name:  "john3",
    Phone: "8615011111114",
    Sex:   1,
    Email: "john3@gmail.com",
}

//SQL: update users set name='john3', phone='8615011111114', sex='1', email='john3@gmail.com' where id='1'
//index: name, phone
//redis key:  sqlx:cache:[table]:[column]:[column value]
if rowsAffected, err := e.Model(&user).
    Table(TABLE_NAME_USERS).
    Select("name", "phone", "email", "sex").
    Cache("name", "phone").
    Update(); err != nil {
    log.Errorf("update data model [%+v] error [%v]", user, err.Error())
} else {
    log.Debugf("update data model [%+v] ok, rows affected [%v]", user, rowsAffected)
}

Documentation

Index

Constants

View Source
const (
	CACHE_INDEX_DEEP  = 1           // index deep in cache
	CACHE_REPLICATE   = "replicate" //replicate host [ip:port,...]
	CACHE_DB_INDEX    = "db"
	CAHCE_SQLX_PREFIX = "sqlx:cache"
)
View Source
const (
	ValueType_Data  valueType = 1 // data of table
	ValueType_Index valueType = 2 // index of data
)
View Source
const (
	TAG_NAME_DB             = "db"
	DRIVER_NAME_MYSQL       = "mysql"
	DRIVER_NAME_POSTGRES    = "postgres"
	DRIVER_NAME_SQLITE      = "sqlite3"
	DRIVER_NAME_MSSQL       = "adodb"
	DRIVER_NAME_REDIS       = "redis"
	DATABASE_KEY_NAME_WHERE = "WHERE"
)
View Source
const (
	ORDER_BY_ASC                 = "asc"
	ORDER_BY_DESC                = "desc"
	DEFAULT_CAHCE_EXPIRE_SECONDS = 24 * 60 * 60
	DEFAULT_PRIMARY_KEY_NAME     = "id"
)
View Source
const (
	ModelType_Struct   = 1
	ModelType_Slice    = 2
	ModelType_Map      = 3
	ModelType_BaseType = 4
)
View Source
const (
	URL_SCHEME_SEP = "://"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type AdapterType

type AdapterType int
const (
	AdapterSqlx_MySQL    AdapterType = 1  //sqlx: mysql
	AdapterSqlx_Postgres AdapterType = 2  //sqlx: postgresql
	AdapterSqlx_Sqlite   AdapterType = 3  //sqlx: sqlite
	AdapterSqlx_Mssql    AdapterType = 4  //sqlx: mssql server
	AdapterCache_Redis   AdapterType = 11 //cache: redis
)

func (AdapterType) DriverName

func (a AdapterType) DriverName() string

func (AdapterType) GoString

func (a AdapterType) GoString() string

func (AdapterType) String

func (a AdapterType) String() string

type Engine

type Engine struct {
	// contains filtered or unexported fields
}

func NewEngine

func NewEngine(args ...interface{}) *Engine

func (*Engine) Asc

func (e *Engine) Asc() *Engine

order by [field1,field2...] asc

func (*Engine) Cache added in v1.0.2

func (e *Engine) Cache(indexes ...string) *Engine

func (*Engine) Debug

func (e *Engine) Debug(ok bool)

debug mode on or off if debug on, some method will panic if your condition illegal

func (*Engine) Desc

func (e *Engine) Desc() *Engine

order by [field1,field2...] desc

func (*Engine) ExecRaw

func (e *Engine) ExecRaw(strQuery string, args ...interface{}) (rowsAffected, lastInsertId int64, err error)

use raw sql to insert/update database, results can not be cached to redis/memcached/memory... return rows affected and error, if err is not nil must be something wrong

func (*Engine) GetPkName

func (e *Engine) GetPkName() string

func (*Engine) GroupBy

func (e *Engine) GroupBy(strColumns ...string) *Engine

group by [field1,field2...]

func (*Engine) Id

func (e *Engine) Id(value interface{}) *Engine

set orm primary key's value

func (*Engine) Insert

func (e *Engine) Insert() (lastInsertId int64, err error)

orm insert return last insert id and error, if err is not nil must be something wrong NOTE: Model function is must be called before call this function

func (*Engine) Limit

func (e *Engine) Limit(args ...int) *Engine

query limit Limit(10) - query records limit 10 (mysql/postgres)

func (*Engine) Model

func (e *Engine) Model(args ...interface{}) *Engine

orm model use to get result set, support single struct object or slice [pointer type] notice: will clone a new engine object for orm operations(query/update/insert/upsert)

func (*Engine) Offset

func (e *Engine) Offset(offset int) *Engine

query offset (for mysql/postgres)

func (*Engine) OnConflict

func (e *Engine) OnConflict(strColumns ...string) *Engine

set the conflict columns for upsert only for postgresql

func (*Engine) Open

func (e *Engine) Open(strUrl string, expireSeconds ...int) *Engine

open a sqlx database or cache connection strUrl:

  1. data source name

    [mysql] Open(AdapterSqlx_MySQL, "mysql://root:123456@127.0.0.1:3306/mydb?charset=utf8mb4") [postgres] Open(AdapterSqlx_Postgres, "postgres://root:123456@127.0.0.1:5432/mydb?sslmode=disable") [sqlite] Open(AdapterSqlx_Sqlite, "sqlite:///var/lib/my.db") [mssql] Open(AdapterSqlx_Mssql, "mssql://sa:123456@127.0.0.1:1433/mydb?instance=&windows=false")

  2. cache config [redis-alone] Open(AdapterTypeCache_Redis, "redis://123456@127.0.0.1:6379/cluster?db=0") [redis-cluster] Open(AdapterTypeCache_Redis, "redis://123456@127.0.0.1:6379/cluster?db=0&replicate=127.0.0.1:6380,127.0.0.1:6381")

expireSeconds cache data expire seconds, just for AdapterTypeCache_XXX

func (*Engine) OrderBy

func (e *Engine) OrderBy(strColumns ...string) *Engine

order by [field1,field2...]

func (*Engine) Query

func (e *Engine) Query() (rowsAffected int64, err error)

orm query return rows affected and error, if err is not nil must be something wrong NOTE: Model function is must be called before call this function

func (*Engine) QueryMap

func (e *Engine) QueryMap(strQuery string, args ...interface{}) (rowsAffected int64, err error)

use raw sql to query results into a map slice (model type is []map[string]string) return results and error NOTE: Model function is must be called before call this function

func (*Engine) QueryRaw

func (e *Engine) QueryRaw(strQuery string, args ...interface{}) (rowsAffected int64, err error)

use raw sql to query results return rows affected and error, if err is not nil must be something wrong NOTE: Model function is must be called before call this function

func (*Engine) Select

func (e *Engine) Select(strColumns ...string) *Engine

orm select/update columns

func (*Engine) SetPkName

func (e *Engine) SetPkName(strName string) *Engine

set orm primary key's name, default named 'id'

func (*Engine) Table

func (e *Engine) Table(strName string) *Engine

set orm query table name when your struct type name is not a table name

func (*Engine) ToTxInsert added in v1.0.2

func (e *Engine) ToTxInsert() *sqlcaTx

make orm tx sql: insert

func (*Engine) ToTxQuery added in v1.0.2

func (e *Engine) ToTxQuery() *sqlcaTx

make orm tx sql: query

func (*Engine) ToTxUpdate added in v1.0.2

func (e *Engine) ToTxUpdate() *sqlcaTx

make orm tx sql: update

func (*Engine) ToTxUpsert added in v1.0.2

func (e *Engine) ToTxUpsert() *sqlcaTx

make orm tx sql: upsert

func (*Engine) Tx added in v1.0.2

func (e *Engine) Tx(args ...*sqlcaTx) (err error)

tx multiple sql by orm

func (*Engine) TxRaw added in v1.0.2

func (e *Engine) TxRaw(sqls ...string) (err error)

tx multiple sql by raw sql

func (*Engine) Update

func (e *Engine) Update() (rowsAffected int64, err error)

orm update from model strColumns... if set, columns will be updated, if none all columns in model will be updated except primary key return rows affected and error, if err is not nil must be something wrong NOTE: Model function is must be called before call this function

func (*Engine) Upsert

func (e *Engine) Upsert() (lastInsertId int64, err error)

orm insert or update if key(s) conflict return last insert id and error, if err is not nil must be something wrong, if your primary key is not a int/int64 type, maybe id return 0 NOTE: Model function is must be called before call this function and call OnConflict function when you are on postgresql

func (*Engine) Where

func (e *Engine) Where(strWhere string) *Engine

orm query return rows affected and error, if err is not nil must be something wrong Model function is must be called before call this function notice: use Where function, the records which be updated can not be refreshed to redis/memcached...

type Fetcher

type Fetcher struct {
	// contains filtered or unexported fields
}

type ModelReflector

type ModelReflector struct {
	// contains filtered or unexported fields
}

func (*ModelReflector) ToMap

func (s *ModelReflector) ToMap(tagName string) map[string]interface{}

parse struct tag and value to map

type ModelType

type ModelType int

func (ModelType) GoString

func (m ModelType) GoString() string

func (ModelType) String

func (m ModelType) String() string

type OperType

type OperType int
const (
	OperType_Query    OperType = 1 // orm: query sql
	OperType_Update   OperType = 2 // orm: update sql
	OperType_Insert   OperType = 3 // orm: insert sql
	OperType_Upsert   OperType = 4 // orm: insert or update sql
	OperType_Tx       OperType = 5 // orm: tx sql
	OperType_QueryRaw OperType = 6 // raw: query sql into model
	OperType_ExecRaw  OperType = 7 // raw: insert/update sql
	OperType_QueryMap OperType = 8 // raw: query sql into map
	OperType_TxRaw    OperType = 9 // raw: tx sql
)

func (OperType) GoString

func (o OperType) GoString() string

func (OperType) String

func (o OperType) String() string

type UrlInfo

type UrlInfo struct {
	Scheme     string
	Host       string // host name and port like '127.0.0.1:3306'
	User       string
	Password   string
	Path       string
	Fragment   string
	Opaque     string
	ForceQuery bool
	Queries    map[string]string
}

func ParseUrl

func ParseUrl(strUrl string) (ui *UrlInfo)

URL have some special characters in password(支持URL中密码包含特殊字符)

Directories

Path Synopsis
cmd
db2go command
dbloader command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL