From 16a21673b33b09713a9678fbf4b3e61036427eaa Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:23:32 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E6=AD=A3TableBuilder=E7=94=9F?= =?UTF-8?q?=E6=88=90Columns=E6=97=B6=E4=B8=8D=E6=8C=89=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E6=8E=92=E5=88=97=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/table.go | 33 ++++++++++++++++++++++----------- sqlx/table_test.go | 7 ++++--- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/sqlx/table.go b/sqlx/table.go index b5b5643..5e45fbe 100644 --- a/sqlx/table.go +++ b/sqlx/table.go @@ -2,7 +2,7 @@ package sqlx import ( "bytes" - "fmt" + "strconv" "strings" ) @@ -10,21 +10,24 @@ import ( // Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com // -//// +type columnDefine struct { + name string + defines string +} type TableBuilder struct { table string - columns map[string]string // 类似:{username: VARCHAR(255) NOT NULL} - constraints []string // 约束列表 - charset string // 表字符编码 - autoIncrement int // 自增编号起步值 + columns []columnDefine + constraints []string + charset string + autoIncrement int ifNotExists bool } func CreateTable(table string) *TableBuilder { return &TableBuilder{ table: table, - columns: make(map[string]string), + columns: make([]columnDefine, 0), constraints: make([]string, 0), charset: "utf8", autoIncrement: 0, @@ -52,7 +55,15 @@ func (slf *TableBuilder) Column(name string) *ColumnTypeBuilder { } func (slf *TableBuilder) addColumn(name string, defines string) { - slf.columns[name] = defines + for _, d := range slf.columns { + if d.name == name { + panic("Duplicated column define, name: " + name) + } + } + slf.columns = append(slf.columns, columnDefine{ + name: name, + defines: defines, + }) } func (slf *TableBuilder) addConstraint(constraint string) { @@ -61,8 +72,8 @@ func (slf *TableBuilder) addConstraint(constraint string) { func (slf *TableBuilder) build() *bytes.Buffer { columns := make([]string, 0) - for name, defines := range slf.columns { - columns = append(columns, EscapeName(name)+defines) + for _, define := range slf.columns { + columns = append(columns, EscapeName(define.name)+define.defines) } buf := new(bytes.Buffer) @@ -77,7 +88,7 @@ func (slf *TableBuilder) build() *bytes.Buffer { buf.WriteString(" DEFAULT CHARSET=") buf.WriteString(slf.charset) buf.WriteString(" AUTO_INCREMENT=") - buf.WriteString(fmt.Sprintf("%d", slf.autoIncrement)) + buf.WriteString(strconv.Itoa(slf.autoIncrement)) return buf } diff --git a/sqlx/table_test.go b/sqlx/table_test.go index 2232845..4aced06 100644 --- a/sqlx/table_test.go +++ b/sqlx/table_test.go @@ -1,7 +1,6 @@ package sqlx import ( - "fmt" "testing" ) @@ -17,6 +16,8 @@ func TestCreateTable(t *testing.T) { Column("age").Int(2).Default0(). Column("register_time").Date().DefaultGetDate(). GetSQL() - // CREATE TABLE `t_users`(`register_time` DATE DEFAULT GETDATE(), `id` INT(20) NOT NULL AUTO_INCREMENT, `username` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `age` INT(2) DEFAULT 0, PRIMARY KEY(`id`), UNIQUE(`username`)) DEFAULT CHARSET=utf8 AUTO_INCREMENT=0; - fmt.Println(sql) + checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_users`(`id` INT(20) NOT NULL AUTO_INCREMENT, "+ + "`username` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `age` INT(2) DEFAULT 0, "+ + "`register_time` DATE DEFAULT GETDATE(), PRIMARY KEY(`id`), UNIQUE(`username`)) "+ + "DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) } -- Gitee From 30f202290fdf59948f52543be96d381faf405085 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:24:02 +0800 Subject: [PATCH 2/9] Use itoa() instead of sprintf() --- sqlx/limit.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sqlx/limit.go b/sqlx/limit.go index 9c55f04..4a837a5 100644 --- a/sqlx/limit.go +++ b/sqlx/limit.go @@ -2,7 +2,7 @@ package sqlx import ( "bytes" - "fmt" + "strconv" ) // @@ -19,13 +19,13 @@ func newLimit(preStatement SQLStatement, limit int) *LimitBuilder { } lb.buffer.WriteString(preStatement.Statement()) lb.buffer.WriteString(" LIMIT ") - lb.buffer.WriteString(fmt.Sprintf("%d", limit)) + lb.buffer.WriteString(strconv.Itoa(limit)) return lb } func (slf *LimitBuilder) Offset(offset int) *LimitBuilder { slf.buffer.WriteString(" OFFSET ") - slf.buffer.WriteString(fmt.Sprintf("%d", offset)) + slf.buffer.WriteString(strconv.Itoa(offset)) return slf } -- Gitee From 718cbf4a64373e99e41c934a3044ec3c0ad64ea3 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:29:32 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0TableColumn=E7=9A=84?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=E8=AE=BE=E7=BD=AE=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/column.go | 14 +++++--------- sqlx/table_test.go | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/sqlx/column.go b/sqlx/column.go index 92b2dc8..2bb77ad 100644 --- a/sqlx/column.go +++ b/sqlx/column.go @@ -189,24 +189,20 @@ func (slf *ColumnTypeBuilder) AutoIncrement() *ColumnTypeBuilder { // -func (slf *ColumnTypeBuilder) DefaultGetDate() *ColumnTypeBuilder { - slf.addKey("DEFAULT GETDATE()") - return slf +func (slf *ColumnTypeBuilder) DefaultNow() *ColumnTypeBuilder { + return slf.Default("NOW()") } func (slf *ColumnTypeBuilder) Default0() *ColumnTypeBuilder { - slf.addKey("DEFAULT 0") - return slf + return slf.Default(0) } func (slf *ColumnTypeBuilder) DefaultEmptyString() *ColumnTypeBuilder { - slf.addKey("DEFAULT ''") - return slf + return slf.Default("''") } func (slf *ColumnTypeBuilder) DefaultNull() *ColumnTypeBuilder { - slf.addKey("DEFAULT NULL") - return slf + return slf.Default("NULL") } func (slf *ColumnTypeBuilder) Default(value interface{}) *ColumnTypeBuilder { diff --git a/sqlx/table_test.go b/sqlx/table_test.go index 4aced06..4f7444f 100644 --- a/sqlx/table_test.go +++ b/sqlx/table_test.go @@ -14,7 +14,7 @@ func TestCreateTable(t *testing.T) { Column("username").VarChar(255).NotNull().Unique(). Column("password").VarChar(255).NotNull(). Column("age").Int(2).Default0(). - Column("register_time").Date().DefaultGetDate(). + Column("register_time").Date().DefaultNow(). GetSQL() checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_users`(`id` INT(20) NOT NULL AUTO_INCREMENT, "+ "`username` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `age` INT(2) DEFAULT 0, "+ -- Gitee From 3bf9fd24413f07b83b2217dc9128cdf0fdcce51f Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:49:35 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0IndexBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/index.go | 79 ++++++++++++++++++++++++++++++++++++++++++++++ sqlx/index_test.go | 18 +++++++++++ 2 files changed, 97 insertions(+) create mode 100644 sqlx/index.go create mode 100644 sqlx/index_test.go diff --git a/sqlx/index.go b/sqlx/index.go new file mode 100644 index 0000000..6ea6252 --- /dev/null +++ b/sqlx/index.go @@ -0,0 +1,79 @@ +package sqlx + +import ( + "bytes" + "strings" +) + +// +// Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com +// + +type IndexBuilder struct { + table string + name string + columns []string + unique bool +} + +func CreateIndex(indexName string) *IndexBuilder { + return &IndexBuilder{ + name: indexName, + columns: make([]string, 0), + } +} + +func (slf *IndexBuilder) Unique() *IndexBuilder { + slf.unique = true + return slf +} + +func (slf *IndexBuilder) OnTable(table string) *IndexBuilder { + slf.table = table + return slf +} + +func (slf *IndexBuilder) Column(name string, desc bool) *IndexBuilder { + var column string + if desc { + column = EscapeName(name) + SQLSpace + "DESC" + } else { + column = EscapeName(column) + } + slf.columns = append(slf.columns, column) + return slf +} + +func (slf *IndexBuilder) Columns(columns ...string) *IndexBuilder { + slf.columns = append(slf.columns, Map(columns, EscapeName)...) + return slf +} + +func (slf *IndexBuilder) build() *bytes.Buffer { + if "" == slf.table { + panic("table not found, you should call 'Table(table)' method to set it") + } + + buf := new(bytes.Buffer) + buf.WriteString("CREATE ") + if slf.unique { + buf.WriteString("UNIQUE ") + } + buf.WriteString("INDEX ") + buf.WriteString(EscapeName(slf.name)) + buf.WriteString(" ON ") + buf.WriteString(EscapeName(slf.table)) + buf.WriteByte('(') + // 在输入时已经转义 + buf.WriteString(strings.Join(slf.columns, SQLComma)) + buf.WriteByte(')') + return buf +} + +func (slf *IndexBuilder) GetSQL() string { + return makeSQL(slf.build()) +} + +func (slf *IndexBuilder) Execute(prepare SQLPrepare) *Executor { + return newExecute(slf.GetSQL(), prepare) +} diff --git a/sqlx/index_test.go b/sqlx/index_test.go new file mode 100644 index 0000000..8b286b7 --- /dev/null +++ b/sqlx/index_test.go @@ -0,0 +1,18 @@ +package sqlx + +import "testing" + +// +// Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com +// + +func TestCreateIndex(t *testing.T) { + sql := CreateIndex("PersonIndex"). + Unique(). + OnTable("t_users"). + Columns("LastName", "FirstName"). + Column("Age", true). + GetSQL() + + checkSQLMatches(sql, "CREATE UNIQUE INDEX `PersonIndex` ON `t_users`(`LastName`, `FirstName`, `Age` DESC);", t) +} -- Gitee From 89426de90e8b1f039448b585e8abc5ad871c63f6 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:54:06 +0800 Subject: [PATCH 5/9] Update vars name --- sqlx/column.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/sqlx/column.go b/sqlx/column.go index 2bb77ad..5f1e1eb 100644 --- a/sqlx/column.go +++ b/sqlx/column.go @@ -12,14 +12,14 @@ import ( type ColumnTypeBuilder struct { table *TableBuilder - column string + name string buffer *bytes.Buffer } -func newColumnType(table *TableBuilder, column string) *ColumnTypeBuilder { +func newColumnType(table *TableBuilder, name string) *ColumnTypeBuilder { ctb := &ColumnTypeBuilder{ table: table, - column: column, + name: name, buffer: new(bytes.Buffer), } return ctb @@ -163,17 +163,18 @@ func (slf *ColumnTypeBuilder) Time() *ColumnTypeBuilder { // func (slf *ColumnTypeBuilder) Unique() *ColumnTypeBuilder { - slf.table.addConstraint(fmt.Sprintf("UNIQUE(%s)", EscapeName(slf.column))) + slf.table.addConstraint(fmt.Sprintf("UNIQUE(%s)", EscapeName(slf.name))) return slf } func (slf *ColumnTypeBuilder) PrimaryKey() *ColumnTypeBuilder { - slf.table.addConstraint(fmt.Sprintf("PRIMARY KEY(%s)", EscapeName(slf.column))) + slf.table.addConstraint(fmt.Sprintf("PRIMARY KEY(%s)", EscapeName(slf.name))) return slf } -func (slf *ColumnTypeBuilder) ForeignKey(refTable string, refColumn string) *ColumnTypeBuilder { - slf.table.addConstraint(fmt.Sprintf("FOREIGN KEY (%s) REFERENCES %s(%s)", slf.column, EscapeName(refTable), EscapeName(refColumn))) +func (slf *ColumnTypeBuilder) ForeignKey(refTableName string, refColumnName string) *ColumnTypeBuilder { + slf.table.addConstraint(fmt.Sprintf("FOREIGN KEY (%s) REFERENCES %s(%s)", + slf.name, EscapeName(refTableName), EscapeName(refColumnName))) return slf } @@ -212,9 +213,9 @@ func (slf *ColumnTypeBuilder) Default(value interface{}) *ColumnTypeBuilder { // -func (slf *ColumnTypeBuilder) Column(column string) *ColumnTypeBuilder { +func (slf *ColumnTypeBuilder) Column(name string) *ColumnTypeBuilder { slf.columnDefineComplete() - return newColumnType(slf.table, column) + return newColumnType(slf.table, name) } func (slf *ColumnTypeBuilder) GetSQL() string { @@ -229,7 +230,7 @@ func (slf *ColumnTypeBuilder) Execute(prepare SQLPrepare) *Executor { // func (slf *ColumnTypeBuilder) columnDefineComplete() { - slf.table.addColumn(slf.column, slf.buffer.String()) + slf.table.addColumn(slf.name, slf.buffer.String()) } func (slf *ColumnTypeBuilder) addKeyWithSize(key string, size int) { -- Gitee From 6f3c86ff299129bd14fdcb3067ab325f64ffe1be Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 14:55:34 +0800 Subject: [PATCH 6/9] Remove exec method --- sqlx/table.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sqlx/table.go b/sqlx/table.go index 5e45fbe..8c6d502 100644 --- a/sqlx/table.go +++ b/sqlx/table.go @@ -95,7 +95,3 @@ func (slf *TableBuilder) build() *bytes.Buffer { func (slf *TableBuilder) GetSQL() string { return makeSQL(slf.build()) } - -func (slf *TableBuilder) Execute(prepare SQLPrepare) *Executor { - return newExecute(slf.GetSQL(), prepare) -} -- Gitee From 06ef8b6a19f13abea254c4b7c539641d94a46ff6 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 16:05:17 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0TableBuilder=E5=88=97?= =?UTF-8?q?=E5=B1=9E=E6=80=A7Unique=E7=9A=84=E5=AE=9E=E7=8E=B0=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=91=BD=E5=90=8D=E5=92=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/column.go | 28 ++++++++++++++++++------- sqlx/table.go | 32 ++++++++++++++++++++++++++-- sqlx/table_test.go | 52 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 98 insertions(+), 14 deletions(-) diff --git a/sqlx/column.go b/sqlx/column.go index 5f1e1eb..811e57b 100644 --- a/sqlx/column.go +++ b/sqlx/column.go @@ -163,7 +163,11 @@ func (slf *ColumnTypeBuilder) Time() *ColumnTypeBuilder { // func (slf *ColumnTypeBuilder) Unique() *ColumnTypeBuilder { - slf.table.addConstraint(fmt.Sprintf("UNIQUE(%s)", EscapeName(slf.name))) + return slf.UniqueNamed("") +} + +func (slf *ColumnTypeBuilder) UniqueNamed(name string) *ColumnTypeBuilder { + slf.table.addUnique(name, EscapeName(slf.name)) return slf } @@ -172,12 +176,16 @@ func (slf *ColumnTypeBuilder) PrimaryKey() *ColumnTypeBuilder { return slf } -func (slf *ColumnTypeBuilder) ForeignKey(refTableName string, refColumnName string) *ColumnTypeBuilder { - slf.table.addConstraint(fmt.Sprintf("FOREIGN KEY (%s) REFERENCES %s(%s)", - slf.name, EscapeName(refTableName), EscapeName(refColumnName))) +func (slf *ColumnTypeBuilder) ForeignKeyNamed(fkName string, refTableName string, refColumnName string) *ColumnTypeBuilder { + slf.table.addConstraint(fmt.Sprintf("%sFOREIGN KEY (%s) REFERENCES %s(%s)", + namedConstraint(fkName), EscapeName(slf.name), EscapeName(refTableName), EscapeName(refColumnName))) return slf } +func (slf *ColumnTypeBuilder) ForeignKey(refTableName string, refColumnName string) *ColumnTypeBuilder { + return slf.ForeignKeyNamed("", refTableName, refColumnName) +} + func (slf *ColumnTypeBuilder) NotNull() *ColumnTypeBuilder { slf.addKey("NOT NULL") return slf @@ -191,19 +199,23 @@ func (slf *ColumnTypeBuilder) AutoIncrement() *ColumnTypeBuilder { // func (slf *ColumnTypeBuilder) DefaultNow() *ColumnTypeBuilder { - return slf.Default("NOW()") + slf.addKey("DEFAULT NOW()") + return slf } func (slf *ColumnTypeBuilder) Default0() *ColumnTypeBuilder { - return slf.Default(0) + slf.addKey("DEFAULT 0") + return slf } func (slf *ColumnTypeBuilder) DefaultEmptyString() *ColumnTypeBuilder { - return slf.Default("''") + slf.addKey("DEFAULT ''") + return slf } func (slf *ColumnTypeBuilder) DefaultNull() *ColumnTypeBuilder { - return slf.Default("NULL") + slf.addKey("DEFAULT NULL") + return slf } func (slf *ColumnTypeBuilder) Default(value interface{}) *ColumnTypeBuilder { diff --git a/sqlx/table.go b/sqlx/table.go index 8c6d502..b690f74 100644 --- a/sqlx/table.go +++ b/sqlx/table.go @@ -18,7 +18,8 @@ type columnDefine struct { type TableBuilder struct { table string columns []columnDefine - constraints []string + constraints []string // 通用的约束列表 + uniques map[string][]string // Unique约束列表,根据名称来合并其Column。默认合并在 “” 组 charset string autoIncrement int ifNotExists bool @@ -29,6 +30,7 @@ func CreateTable(table string) *TableBuilder { table: table, columns: make([]columnDefine, 0), constraints: make([]string, 0), + uniques: make(map[string][]string), charset: "utf8", autoIncrement: 0, ifNotExists: true, @@ -66,16 +68,34 @@ func (slf *TableBuilder) addColumn(name string, defines string) { }) } +func (slf *TableBuilder) addUnique(name string, column string) { + if exists, ok := slf.uniques[name]; ok { + slf.uniques[name] = append(exists, column) + } else { + slf.uniques[name] = append(make([]string, 0), column) + } +} + func (slf *TableBuilder) addConstraint(constraint string) { slf.constraints = append(slf.constraints, constraint) } func (slf *TableBuilder) build() *bytes.Buffer { + // 数据列 columns := make([]string, 0) for _, define := range slf.columns { columns = append(columns, EscapeName(define.name)+define.defines) } + // 通用约束 + columns = append(columns, slf.constraints...) + + // Unique约束列 + for name, colNames := range slf.uniques { + constraint := namedConstraint(name) + "UNIQUE (" + strings.Join(colNames, SQLComma) + ")" + columns = append(columns, constraint) + } + buf := new(bytes.Buffer) buf.WriteString("CREATE TABLE ") if slf.ifNotExists { @@ -83,7 +103,7 @@ func (slf *TableBuilder) build() *bytes.Buffer { } buf.WriteString(EscapeName(slf.table)) buf.WriteByte('(') - buf.WriteString(strings.Join(append(columns, slf.constraints...), SQLComma)) + buf.WriteString(strings.Join(columns, SQLComma)) buf.WriteByte(')') buf.WriteString(" DEFAULT CHARSET=") buf.WriteString(slf.charset) @@ -95,3 +115,11 @@ func (slf *TableBuilder) build() *bytes.Buffer { func (slf *TableBuilder) GetSQL() string { return makeSQL(slf.build()) } + +func namedConstraint(name string) string { + if len(name) > 0 { + return "CONSTRAINT " + EscapeName(name) + SQLSpace + } else { + return "" + } +} diff --git a/sqlx/table_test.go b/sqlx/table_test.go index 4f7444f..42e7ea4 100644 --- a/sqlx/table_test.go +++ b/sqlx/table_test.go @@ -16,8 +16,52 @@ func TestCreateTable(t *testing.T) { Column("age").Int(2).Default0(). Column("register_time").Date().DefaultNow(). GetSQL() - checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_users`(`id` INT(20) NOT NULL AUTO_INCREMENT, "+ - "`username` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `age` INT(2) DEFAULT 0, "+ - "`register_time` DATE DEFAULT GETDATE(), PRIMARY KEY(`id`), UNIQUE(`username`)) "+ - "DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) + checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_users`("+ + "`id` INT(20) NOT NULL AUTO_INCREMENT, "+ + "`username` VARCHAR(255) NOT NULL, "+ + "`password` VARCHAR(255) NOT NULL, "+ + "`age` INT(2) DEFAULT 0, "+ + "`register_time` DATE DEFAULT NOW(), "+ + "PRIMARY KEY(`id`), "+ + "UNIQUE (`username`)"+ + ") DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) +} + +func TestTableBuilder_ForeignKey(t *testing.T) { + sql := CreateTable("t_user"). + Column("id").Int(12).NotNull().PrimaryKey().AutoIncrement(). + Column("pid").Int(12).ForeignKey("t_profile", "prof_id"). + GetSQL() + checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_user`("+ + "`id` INT(12) NOT NULL AUTO_INCREMENT, "+ + "`pid` INT(12), PRIMARY KEY(`id`), "+ + "FOREIGN KEY (`pid`) REFERENCES `t_profile`(`prof_id`)"+ + ") DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) +} + +func TestTableBuilder_ForeignKeyNamed(t *testing.T) { + sql := CreateTable("t_user"). + Column("id").Int(12).NotNull().PrimaryKey().AutoIncrement(). + Column("pid").Int(12).ForeignKeyNamed("FK_PID", "t_profile", "prof_id"). + GetSQL() + checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_user`("+ + "`id` INT(12) NOT NULL AUTO_INCREMENT, "+ + "`pid` INT(12), PRIMARY KEY(`id`), "+ + "CONSTRAINT `FK_PID` FOREIGN KEY (`pid`) REFERENCES `t_profile`(`prof_id`)"+ + ") DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) +} + +func TestTableBuilder_UniqueNamed(t *testing.T) { + sql := CreateTable("t_user"). + Column("id").Int(12).NotNull().PrimaryKey().AutoIncrement(). + Column("pid").Int(12).UniqueNamed("uc_Id_P"). + Column("pid_bak").Int(12).UniqueNamed("uc_Id_P"). + GetSQL() + checkSQLMatches(sql, "CREATE TABLE IF NOT EXISTS `t_user`("+ + "`id` INT(12) NOT NULL AUTO_INCREMENT, "+ + "`pid` INT(12), "+ + "`pid_bak` INT(12), "+ + "PRIMARY KEY(`id`), "+ + "CONSTRAINT `uc_Id_P` UNIQUE (`pid`, `pid_bak`)"+ + ") DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;", t) } -- Gitee From 34e2bf05d790b79b7d83c568553222b1494da733 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 16:16:29 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0CreateIndexBuilder?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/{index.go => create_index.go} | 20 ++++++++++---------- sqlx/{index_test.go => create_index_test.go} | 0 2 files changed, 10 insertions(+), 10 deletions(-) rename sqlx/{index.go => create_index.go} (65%) rename sqlx/{index_test.go => create_index_test.go} (100%) diff --git a/sqlx/index.go b/sqlx/create_index.go similarity index 65% rename from sqlx/index.go rename to sqlx/create_index.go index 6ea6252..b30ae4e 100644 --- a/sqlx/index.go +++ b/sqlx/create_index.go @@ -9,31 +9,31 @@ import ( // Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com // -type IndexBuilder struct { +type CreateIndexBuilder struct { table string name string columns []string unique bool } -func CreateIndex(indexName string) *IndexBuilder { - return &IndexBuilder{ +func CreateIndex(indexName string) *CreateIndexBuilder { + return &CreateIndexBuilder{ name: indexName, columns: make([]string, 0), } } -func (slf *IndexBuilder) Unique() *IndexBuilder { +func (slf *CreateIndexBuilder) Unique() *CreateIndexBuilder { slf.unique = true return slf } -func (slf *IndexBuilder) OnTable(table string) *IndexBuilder { +func (slf *CreateIndexBuilder) OnTable(table string) *CreateIndexBuilder { slf.table = table return slf } -func (slf *IndexBuilder) Column(name string, desc bool) *IndexBuilder { +func (slf *CreateIndexBuilder) Column(name string, desc bool) *CreateIndexBuilder { var column string if desc { column = EscapeName(name) + SQLSpace + "DESC" @@ -44,12 +44,12 @@ func (slf *IndexBuilder) Column(name string, desc bool) *IndexBuilder { return slf } -func (slf *IndexBuilder) Columns(columns ...string) *IndexBuilder { +func (slf *CreateIndexBuilder) Columns(columns ...string) *CreateIndexBuilder { slf.columns = append(slf.columns, Map(columns, EscapeName)...) return slf } -func (slf *IndexBuilder) build() *bytes.Buffer { +func (slf *CreateIndexBuilder) build() *bytes.Buffer { if "" == slf.table { panic("table not found, you should call 'Table(table)' method to set it") } @@ -70,10 +70,10 @@ func (slf *IndexBuilder) build() *bytes.Buffer { return buf } -func (slf *IndexBuilder) GetSQL() string { +func (slf *CreateIndexBuilder) GetSQL() string { return makeSQL(slf.build()) } -func (slf *IndexBuilder) Execute(prepare SQLPrepare) *Executor { +func (slf *CreateIndexBuilder) Execute(prepare SQLPrepare) *Executor { return newExecute(slf.GetSQL(), prepare) } diff --git a/sqlx/index_test.go b/sqlx/create_index_test.go similarity index 100% rename from sqlx/index_test.go rename to sqlx/create_index_test.go -- Gitee From a46567730117778f6a230cf384b9b5b528752863 Mon Sep 17 00:00:00 2001 From: "yoojia.chen" Date: Thu, 17 May 2018 16:16:46 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0DropIndexBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlx/drop_index.go | 46 +++++++++++++++++++++++++++++++++++++++++ sqlx/drop_index_test.go | 14 +++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 sqlx/drop_index.go create mode 100644 sqlx/drop_index_test.go diff --git a/sqlx/drop_index.go b/sqlx/drop_index.go new file mode 100644 index 0000000..804c621 --- /dev/null +++ b/sqlx/drop_index.go @@ -0,0 +1,46 @@ +package sqlx + +import ( + "bytes" +) + +// +// Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com +// + +type DropIndexBuilder struct { + name string + table string +} + +func DropIndex(indexName string) *DropIndexBuilder { + return &DropIndexBuilder{ + name: indexName, + } +} + +func (slf *DropIndexBuilder) OnTable(table string) *DropIndexBuilder { + slf.table = table + return slf +} + +func (slf *DropIndexBuilder) build() *bytes.Buffer { + if "" == slf.table { + panic("table not found, you should call 'OnTable(table)' method to set it") + } + //ALTER TABLE table_name DROP INDEX index_name + buf := new(bytes.Buffer) + buf.WriteString("ALTER TABLE ") + buf.WriteString(EscapeName(slf.table)) + buf.WriteString(" DROP INDEX ") + buf.WriteString(EscapeName(slf.name)) + return buf +} + +func (slf *DropIndexBuilder) GetSQL() string { + return makeSQL(slf.build()) +} + +func (slf *DropIndexBuilder) Execute(prepare SQLPrepare) *Executor { + return newExecute(slf.GetSQL(), prepare) +} diff --git a/sqlx/drop_index_test.go b/sqlx/drop_index_test.go new file mode 100644 index 0000000..7db2742 --- /dev/null +++ b/sqlx/drop_index_test.go @@ -0,0 +1,14 @@ +package sqlx + +import "testing" + +// +// Author: 陈永佳 chenyongjia@parkingwang.com, yoojiachen@gmail.com +// + +func TestDropIndex(t *testing.T) { + sql := DropIndex("idx_Uid"). + OnTable("t_username"). + GetSQL() + checkSQLMatches(sql, "ALTER TABLE `t_username` DROP INDEX `idx_Uid`;", t) +} -- Gitee