add set type

This commit is contained in:
Lunny Xiao 2014-08-07 22:17:14 +08:00
parent 5c91281635
commit 865fc8c0fb
3 changed files with 89 additions and 60 deletions

View File

@ -32,6 +32,7 @@ type Column struct {
fieldPath []string fieldPath []string
DefaultIsEmpty bool DefaultIsEmpty bool
EnumOptions map[string]int EnumOptions map[string]int
SetOptions map[string]int
} }
func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable bool) *Column { func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable bool) *Column {

View File

@ -7,12 +7,14 @@ import (
"testing" "testing"
"time" "time"
_ "github.com/go-sql-driver/mysql"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
var ( var (
createTableSqlite3 = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NULL, " + //dbtype string = "sqlite3"
"`title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL, `created` datetime);" dbtype string = "mysql"
createTableSql string
) )
type User struct { type User struct {
@ -25,22 +27,46 @@ type User struct {
Created time.Time Created time.Time
} }
func init() {
switch dbtype {
case "sqlite3":
createTableSql = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NULL, " +
"`title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL, `created` datetime);"
case "mysql":
createTableSql = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, `name` TEXT NULL, " +
"`title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL, `created` datetime);"
default:
panic("no db type")
}
}
func testOpen() (*DB, error) {
switch dbtype {
case "sqlite3":
os.Remove("./test.db")
return Open("sqlite3", "./test.db")
case "mysql":
return Open("mysql", "root:@/core_test?charset=utf8&parseTime=true")
default:
panic("no db type")
}
}
func BenchmarkOriQuery(b *testing.B) { func BenchmarkOriQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db") db, err := testOpen()
db, err := Open("sqlite3", "./test.db")
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
for i := 0; i < 50; i++ { for i := 0; i < 50; i++ {
_, err = db.Exec("insert into user (name, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)", _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)",
"xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now()) "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -72,20 +98,20 @@ func BenchmarkOriQuery(b *testing.B) {
func BenchmarkStructQuery(b *testing.B) { func BenchmarkStructQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
for i := 0; i < 50; i++ { for i := 0; i < 50; i++ {
_, err = db.Exec("insert into user (name, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)", _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)",
"xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now()) "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -117,20 +143,20 @@ func BenchmarkStructQuery(b *testing.B) {
func BenchmarkStruct2Query(b *testing.B) { func BenchmarkStruct2Query(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
for i := 0; i < 50; i++ { for i := 0; i < 50; i++ {
_, err = db.Exec("insert into user (name, title, age, alias, nick_name, created) values (?,?,?,?,?,?)", _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?,?)",
"xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now()) "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -163,20 +189,20 @@ func BenchmarkStruct2Query(b *testing.B) {
func BenchmarkSliceInterfaceQuery(b *testing.B) { func BenchmarkSliceInterfaceQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
for i := 0; i < 50; i++ { for i := 0; i < 50; i++ {
_, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)", _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
"xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now()) "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -221,7 +247,7 @@ func BenchmarkSliceInterfaceQuery(b *testing.B) {
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -262,17 +288,17 @@ func BenchmarkSliceInterfaceQuery(b *testing.B) {
rows.Close() rows.Close()
} }
} }
*/
func BenchmarkSliceStringQuery(b *testing.B) { func BenchmarkSliceStringQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db") db, err := testOpen()
db, err := Open("sqlite3", "./test.db")
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -299,12 +325,12 @@ func BenchmarkSliceStringQuery(b *testing.B) {
} }
for rows.Next() { for rows.Next() {
slice := make([]string, len(cols)) slice := make([]*string, len(cols))
err = rows.ScanSlice(&slice) err = rows.ScanSlice(&slice)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
if slice[1] != "xlw" { if (*slice[1]) != "xlw" {
fmt.Println(slice) fmt.Println(slice)
b.Error(errors.New("name should be xlw")) b.Error(errors.New("name should be xlw"))
} }
@ -312,18 +338,18 @@ func BenchmarkSliceStringQuery(b *testing.B) {
rows.Close() rows.Close()
} }
}*/ }
func BenchmarkMapInterfaceQuery(b *testing.B) { func BenchmarkMapInterfaceQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -369,7 +395,7 @@ func BenchmarkMapInterfaceQuery(b *testing.B) {
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -405,7 +431,8 @@ func BenchmarkMapInterfaceQuery(b *testing.B) {
rows.Close() rows.Close()
} }
} }
*/
/*
func BenchmarkMapStringQuery(b *testing.B) { func BenchmarkMapStringQuery(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db") os.Remove("./test.db")
@ -415,7 +442,7 @@ func BenchmarkMapStringQuery(b *testing.B) {
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -454,14 +481,14 @@ func BenchmarkMapStringQuery(b *testing.B) {
func BenchmarkExec(b *testing.B) { func BenchmarkExec(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -469,7 +496,7 @@ func BenchmarkExec(b *testing.B) {
b.StartTimer() b.StartTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)", _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
"xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now()) "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -479,14 +506,14 @@ func BenchmarkExec(b *testing.B) {
func BenchmarkExecMap(b *testing.B) { func BenchmarkExecMap(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db")
db, err := Open("sqlite3", "./test.db") db, err := testOpen()
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -503,8 +530,8 @@ func BenchmarkExecMap(b *testing.B) {
} }
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_, err = db.ExecMap(`insert into user (name, title, age, alias, nick_name, created) _, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name, created) "+
values (?name,?title,?age,?alias,?nick_name,?created)`, "values (?name,?title,?age,?alias,?nick_name,?created)",
&mp) &mp)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
@ -513,14 +540,13 @@ func BenchmarkExecMap(b *testing.B) {
} }
func TestExecMap(t *testing.T) { func TestExecMap(t *testing.T) {
os.Remove("./test.db") db, err := testOpen()
db, err := Open("sqlite3", "./test.db")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -534,8 +560,8 @@ func TestExecMap(t *testing.T) {
"created": time.Now(), "created": time.Now(),
} }
_, err = db.ExecMap(`insert into user (name, title, age, alias, nick_name,created) _, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name,created) "+
values (?name,?title,?age,?alias,?nick_name,?created)`, "values (?name,?title,?age,?alias,?nick_name,?created)",
&mp) &mp)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
@ -557,14 +583,13 @@ func TestExecMap(t *testing.T) {
} }
func TestExecStruct(t *testing.T) { func TestExecStruct(t *testing.T) {
os.Remove("./test.db") db, err := testOpen()
db, err := Open("sqlite3", "./test.db")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -577,14 +602,14 @@ func TestExecStruct(t *testing.T) {
Created: time.Now(), Created: time.Now(),
} }
_, err = db.ExecStruct(`insert into user (name, title, age, alias, nick_name,created) _, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) "+
values (?Name,?Title,?Age,?Alias,?NickName,?Created)`, "values (?Name,?Title,?Age,?Alias,?NickName,?Created)",
&user) &user)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
rows, err := db.QueryStruct("select * from user where name = ?Name", &user) rows, err := db.QueryStruct("select * from user where `name` = ?Name", &user)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -601,14 +626,13 @@ func TestExecStruct(t *testing.T) {
func BenchmarkExecStruct(b *testing.B) { func BenchmarkExecStruct(b *testing.B) {
b.StopTimer() b.StopTimer()
os.Remove("./test.db") db, err := testOpen()
db, err := Open("sqlite3", "./test.db")
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
defer db.Close() defer db.Close()
_, err = db.Exec(createTableSqlite3) _, err = db.Exec(createTableSql)
if err != nil { if err != nil {
b.Error(err) b.Error(err)
} }
@ -624,8 +648,8 @@ func BenchmarkExecStruct(b *testing.B) {
} }
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_, err = db.ExecStruct(`insert into user (name, title, age, alias, nick_name,created) _, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) "+
values (?Name,?Title,?Age,?Alias,?NickName,?Created)`, "values (?Name,?Title,?Age,?Alias,?NickName,?Created)",
&user) &user)
if err != nil { if err != nil {
b.Error(err) b.Error(err)

View File

@ -63,6 +63,8 @@ var (
BigInt = "BIGINT" BigInt = "BIGINT"
Enum = "ENUM" Enum = "ENUM"
Set = "SET"
Char = "CHAR" Char = "CHAR"
Varchar = "VARCHAR" Varchar = "VARCHAR"
TinyText = "TINYTEXT" TinyText = "TINYTEXT"
@ -107,6 +109,8 @@ var (
BigInt: NUMERIC_TYPE, BigInt: NUMERIC_TYPE,
Enum: TEXT_TYPE, Enum: TEXT_TYPE,
Set: TEXT_TYPE,
Char: TEXT_TYPE, Char: TEXT_TYPE,
Varchar: TEXT_TYPE, Varchar: TEXT_TYPE,
TinyText: TEXT_TYPE, TinyText: TEXT_TYPE,
@ -297,7 +301,7 @@ func SQLType2Type(st SQLType) reflect.Type {
return reflect.TypeOf(float32(1)) return reflect.TypeOf(float32(1))
case Double: case Double:
return reflect.TypeOf(float64(1)) return reflect.TypeOf(float64(1))
case Char, Varchar, TinyText, Text, MediumText, LongText, Enum,Uuid: case Char, Varchar, TinyText, Text, MediumText, LongText, Enum, Set, Uuid:
return reflect.TypeOf("") return reflect.TypeOf("")
case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary: case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary:
return reflect.TypeOf([]byte{}) return reflect.TypeOf([]byte{})