From 24aa0d3f9bc6be4da8fd92c32be5b138ebc1b352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Mon, 17 Jun 2024 16:30:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8D=87=E7=BA=A7=20install=20=E8=83=BD?= =?UTF-8?q?=E5=8A=9B,=20=E6=94=AF=E6=8C=81sqlite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client.go | 6 +++--- define.go | 7 ------- go.mod | 2 +- go.sum | 2 ++ install/define/field.go | 22 ++++++++++++++++++++-- install/define/table.go | 33 +++++++++++++++++++++++++++++++-- install/define/tpl.go | 7 +++++++ 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/client.go b/client.go index 5479c83..c410cd9 100644 --- a/client.go +++ b/client.go @@ -234,11 +234,11 @@ func (c *client) GetDatabaseClient(conf *Driver, logInstance *zap.Logger) (*gorm err error ) - if conf.DBType == DriverTypeMysql { + if conf.DBType == consts.DatabaseDriverMysql { if instance, err = gorm.Open(mysql.Open(c.buildConnectionDSN(conf)), &gorm.Config{}); nil != err { return nil, err } - } else if conf.DBType == DriverTypeSqlite3 { + } else if conf.DBType == consts.DatabaseDriverSqlite3 { if instance, err = gorm.Open(sqlite.Open(c.buildConnectionDSN(conf)), &gorm.Config{}); nil != err { return nil, err } @@ -257,7 +257,7 @@ func (c *client) GetDatabaseClient(conf *Driver, logInstance *zap.Logger) (*gorm // // Date : 18:42 2022/6/11 func (c *client) buildConnectionDSN(conf *Driver) string { - if conf.DBType == DriverTypeSqlite3 { + if conf.DBType == consts.DatabaseDriverSqlite3 { // 兼容sqlite3 return conf.Host } diff --git a/define.go b/define.go index 2752d16..1c09d03 100644 --- a/define.go +++ b/define.go @@ -61,13 +61,6 @@ type Driver struct { Timezone string `json:"timezone" yaml:"timezone"` // 时区 } -const ( - // DriverTypeMysql mysql 驱动 - DriverTypeMysql = "mysql" - // DriverTypeSqlite3 sqlite3 - DriverTypeSqlite3 = "sqlite3" -) - // Connection 连接数配置 // // Author : go_developer@163.com<白茶清欢> diff --git a/go.mod b/go.mod index d78df65..27a8241 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.21.3 require ( - git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617031827-bf96f1ebd52e + git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617073616-39e82fd033ed git.zhangdeman.cn/zhangdeman/logger v0.0.0-20240308024848-54993a0ed4a6 git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0 git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20240325080031-1f58204e8687 diff --git a/go.sum b/go.sum index 4907dcd..3bb7aeb 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240612081722-31c64d4d4ce7 h1:QR8vMX git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240612081722-31c64d4d4ce7/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617031827-bf96f1ebd52e h1:hgOeedMt/VC62PQkGbzzDpVGcYF7LifYRq7swFzSdHQ= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617031827-bf96f1ebd52e/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617073616-39e82fd033ed h1:BGv+y6ZdtkxI4HeSIHun0QRrIzjLnUht0bKdyO2t6n4= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240617073616-39e82fd033ed/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20240311030808-e2a2e6a3c211 h1:I/wOsRpCSRkU9vo1u703slQsmK0wnNeZzsWQOGtIAG0= git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20240311030808-e2a2e6a3c211/go.mod h1:SrtvrQRdzt+8KfYzvosH++gWxo2ShPTzR1m3VQ6uX7U= git.zhangdeman.cn/zhangdeman/gin v0.0.0-20240315025001-0ffe074179ad h1:7gjk79UkYOo7AvEFXSZoHeobahGZjltOCLdpFe5Wy80= diff --git a/install/define/field.go b/install/define/field.go index ce68546..910e978 100644 --- a/install/define/field.go +++ b/install/define/field.go @@ -7,7 +7,10 @@ // Date : 2023-09-17 18:07 package define -import "strings" +import ( + "git.zhangdeman.cn/zhangdeman/consts" + "strings" +) // Field 表字段结构 // @@ -111,7 +114,7 @@ func (f *Field) ToString() (string, error) { if err := f.Validate(); nil != err { return "", err } - fieldTpl := MysqlFieldTpl + fieldTpl := f.getFieldTpl() dataReplaceTable := map[string]string{ FieldName: f.Name, // 字段名 FieldType: f.Type, // 字段类型 @@ -178,3 +181,18 @@ func (f *Field) ToStringIgnoreError() string { sql, _ := f.ToString() return sql } + +// getFieldTpl 表字段模板 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 15:14 2024/6/17 +func (f *Field) getFieldTpl() string { + switch DatabaseDriver { + case consts.DatabaseDriverMysql: + return MysqlFieldTpl + case consts.DatabaseDriverSqlite3: + return SqliteFieldTpl + } + panic(DatabaseDriver + " : database driver is not support") +} diff --git a/install/define/table.go b/install/define/table.go index 86e7e6d..6237679 100644 --- a/install/define/table.go +++ b/install/define/table.go @@ -9,9 +9,23 @@ package define import ( "fmt" + "git.zhangdeman.cn/zhangdeman/consts" "strings" ) +var ( + DatabaseDriver = consts.DatabaseDriverMysql +) + +// SetDatabaseDriver 设置数据库驱动 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 14:48 2024/6/17 +func SetDatabaseDriver(databaseDriver string) { + DatabaseDriver = databaseDriver +} + // Table 数据表的数据结构 // // Author : go_developer@163.com<白茶清欢> @@ -82,7 +96,7 @@ func (t *Table) Validate() error { // // Date : 18:46 2023/9/17 func (t *Table) ToString() (string, error) { - tableTpl := MysqlTableTpl + tableTpl := t.getTableSqlTpl() replaceTable := map[string]string{ TableName: t.Name, // 表名 TableFieldList: "", // 表字段 @@ -109,7 +123,7 @@ func (t *Table) ToString() (string, error) { } indexList = append(indexList, indexStr) } - if len(indexList) == 0 { + if len(indexList) == 0 || consts.DatabaseDriverSqlite3 == DatabaseDriver { replaceTable[TableFieldList] = strings.Join(fieldList, ",") } else { replaceTable[TableFieldList] = strings.Join(fieldList, ",") + "," @@ -151,3 +165,18 @@ func (t *Table) ToStringIgnoreError() string { sql, _ := t.ToString() return sql } + +// getTableSqlTpl 获取表结构的模板 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 14:50 2024/6/17 +func (t *Table) getTableSqlTpl() string { + switch DatabaseDriver { + case consts.DatabaseDriverMysql: + return MysqlTableTpl + case consts.DatabaseDriverSqlite3: + return SqliteTableTpl + } + panic(DatabaseDriver + " : database driver is not support") +} diff --git a/install/define/tpl.go b/install/define/tpl.go index 23b534a..ecc86ea 100644 --- a/install/define/tpl.go +++ b/install/define/tpl.go @@ -61,6 +61,13 @@ var ( MysqlTableTpl = fmt.Sprintf("CREATE TABLE %v (%v %v) %v %v %v %v %v;", TableName, TableFieldList, TableIndexList, TableEngine, TableAutoIncrement, TableDefaultCharset, TableDefaultCollate, TableComment) ) +var ( + // SqliteFieldTpl sqlite 表字段模板 + SqliteFieldTpl = fmt.Sprintf("%v %v", FieldName, FieldType) + // SqliteTableTpl 创建表sql语句 + SqliteTableTpl = fmt.Sprintf("CREATE TABLE %v (%v);", TableName, TableFieldList) +) + const ( // TableIndexPrimary 主键索引 TableIndexPrimary = "PRIMARY" From 572ed2b0f3292be04a8640875805cd29de9b72ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Mon, 17 Jun 2024 17:50:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=94=AF=E6=8C=81sqlite=E8=A1=A8=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/define/field.go | 3 +++ install/define/index.go | 51 +++++++++++++++++++++++++++++------------ install/define/table.go | 22 +++++++++--------- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/install/define/field.go b/install/define/field.go index 910e978..667f3c9 100644 --- a/install/define/field.go +++ b/install/define/field.go @@ -115,6 +115,9 @@ func (f *Field) ToString() (string, error) { return "", err } fieldTpl := f.getFieldTpl() + if f.PrimaryKey && DatabaseDriver == consts.DatabaseDriverSqlite3 { + f.Type = "INTEGER PRIMARY KEY AUTOINCREMENT" + } dataReplaceTable := map[string]string{ FieldName: f.Name, // 字段名 FieldType: f.Type, // 字段类型 diff --git a/install/define/index.go b/install/define/index.go index d35650e..b71af79 100644 --- a/install/define/index.go +++ b/install/define/index.go @@ -8,7 +8,9 @@ package define import ( + "errors" "fmt" + "git.zhangdeman.cn/zhangdeman/consts" "strings" ) @@ -76,24 +78,43 @@ func (i *Index) Validate() error { // Author : go_developer@163.com<白茶清欢> // // Date : 17:47 2023/9/17 -func (i *Index) ToString() (string, error) { +func (i *Index) ToString(tableName string) (string, error) { if err := i.Validate(); nil != err { return "", err } - // 拼接sql - switch i.Type { - case TableIndexPrimary: - return fmt.Sprintf("PRIMARY KEY (%v)", i.FieldList[0]), nil - case TableIndexUnique: - return fmt.Sprintf("UNIQUE KEY %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil - case TableIndexKey: - return fmt.Sprintf("KEY %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil - case TableIndexIndex: - return fmt.Sprintf("INDEX %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil - default: - return fmt.Sprintf("%v %v (%v)", i.Type, i.Name, strings.Join(i.FieldList, ",")), nil + switch DatabaseDriver { + case consts.DatabaseDriverMysql: + // 拼接sql + switch i.Type { + case TableIndexPrimary: + return fmt.Sprintf("ALTER TABLE `%v` ADD PRIMARY KEY (%v)", tableName, i.FieldList[0]), nil + case TableIndexUnique: + return fmt.Sprintf("ALTER TABLE `%v` ADD UNIQUE KEY %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + case TableIndexKey: + return fmt.Sprintf("ALTER TABLE `%v` ADD KEY %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + case TableIndexIndex: + return fmt.Sprintf("ALTER TABLE `%v` ADD INDEX %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + default: + return fmt.Sprintf("ALTER TABLE `%v` ADD %v %v (%v)", tableName, i.Type, i.Name, strings.Join(i.FieldList, ",")), nil + } + case consts.DatabaseDriverSqlite3: + // 拼接sql + switch i.Type { + case TableIndexPrimary: + return "", nil + // return fmt.Sprintf("ALTER TABLE %v ADD CONSTRAINT %v PRIMARY KEY AUTOINCREMENT (%v)", tableName, i.FieldList[0], i.FieldList[0]), nil + case TableIndexUnique: + return fmt.Sprintf("CREATE UNIQUE INDEX %v ON %v (%v)", i.Name, tableName, strings.Join(i.FieldList, ",")), nil + case TableIndexKey: + fallthrough + case TableIndexIndex: + return fmt.Sprintf("CREATE INDEX %v ON %v (%v)", i.Name, tableName, strings.Join(i.FieldList, ",")), nil + default: + return fmt.Sprintf("CREATE %v %v ON %v (%v)", i.Type, i.Name, tableName, strings.Join(i.FieldList, ",")), nil + } } + return "", errors.New(DatabaseDriver + " : database driver is not support") } // ToStringIgnoreError ... @@ -101,7 +122,7 @@ func (i *Index) ToString() (string, error) { // Author : go_developer@163.com<白茶清欢> // // Date : 15:59 2023/9/18 -func (i *Index) ToStringIgnoreError() string { - sql, _ := i.ToString() +func (i *Index) ToStringIgnoreError(tableName string) string { + sql, _ := i.ToString(tableName) return sql } diff --git a/install/define/table.go b/install/define/table.go index 6237679..103714e 100644 --- a/install/define/table.go +++ b/install/define/table.go @@ -95,7 +95,7 @@ func (t *Table) Validate() error { // Author : go_developer@163.com<白茶清欢> // // Date : 18:46 2023/9/17 -func (t *Table) ToString() (string, error) { +func (t *Table) ToString() ([]string, error) { tableTpl := t.getTableSqlTpl() replaceTable := map[string]string{ TableName: t.Name, // 表名 @@ -111,23 +111,22 @@ func (t *Table) ToString() (string, error) { for _, item := range t.FieldList { fieldStr, err := item.ToString() if nil != err { - return "", err + return nil, err } fieldList = append(fieldList, fieldStr) } indexList := make([]string, 0) for _, item := range t.IndexList { - indexStr, err := item.ToString() + indexStr, err := item.ToString(t.Name) if nil != err { - return "", err + return nil, err + } + if len(indexStr) == 0 { + continue } indexList = append(indexList, indexStr) } - if len(indexList) == 0 || consts.DatabaseDriverSqlite3 == DatabaseDriver { - replaceTable[TableFieldList] = strings.Join(fieldList, ",") - } else { - replaceTable[TableFieldList] = strings.Join(fieldList, ",") + "," - } + replaceTable[TableFieldList] = strings.Join(fieldList, ",") replaceTable[TableIndexList] = strings.Join(indexList, ",") if len(t.Engine) > 0 { @@ -153,7 +152,8 @@ func (t *Table) ToString() (string, error) { for source, target := range replaceTable { tableTpl = strings.ReplaceAll(tableTpl, source, target) } - return tableTpl, nil + + return append([]string{tableTpl}, indexList...), nil } // ToStringIgnoreError ... @@ -161,7 +161,7 @@ func (t *Table) ToString() (string, error) { // Author : go_developer@163.com<白茶清欢> // // Date : 15:59 2023/9/18 -func (t *Table) ToStringIgnoreError() string { +func (t *Table) ToStringIgnoreError() []string { sql, _ := t.ToString() return sql } From 5c7a0d235ee1f99fac813bd0929ab1196372181e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Mon, 17 Jun 2024 18:15:38 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20mysql=20=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E7=94=9F=E6=88=90=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/define/index.go | 10 +++++----- install/define/table.go | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/install/define/index.go b/install/define/index.go index b71af79..159789f 100644 --- a/install/define/index.go +++ b/install/define/index.go @@ -88,15 +88,15 @@ func (i *Index) ToString(tableName string) (string, error) { // 拼接sql switch i.Type { case TableIndexPrimary: - return fmt.Sprintf("ALTER TABLE `%v` ADD PRIMARY KEY (%v)", tableName, i.FieldList[0]), nil + return fmt.Sprintf("PRIMARY KEY (%v)", i.FieldList[0]), nil case TableIndexUnique: - return fmt.Sprintf("ALTER TABLE `%v` ADD UNIQUE KEY %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + return fmt.Sprintf("UNIQUE KEY %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil case TableIndexKey: - return fmt.Sprintf("ALTER TABLE `%v` ADD KEY %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + return fmt.Sprintf("KEY %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil case TableIndexIndex: - return fmt.Sprintf("ALTER TABLE `%v` ADD INDEX %v (%v)", tableName, i.Name, strings.Join(i.FieldList, ",")), nil + return fmt.Sprintf("INDEX %v (%v)", i.Name, strings.Join(i.FieldList, ",")), nil default: - return fmt.Sprintf("ALTER TABLE `%v` ADD %v %v (%v)", tableName, i.Type, i.Name, strings.Join(i.FieldList, ",")), nil + return fmt.Sprintf("%v %v (%v)", i.Type, i.Name, strings.Join(i.FieldList, ",")), nil } case consts.DatabaseDriverSqlite3: // 拼接sql diff --git a/install/define/table.go b/install/define/table.go index 103714e..dae7cee 100644 --- a/install/define/table.go +++ b/install/define/table.go @@ -127,7 +127,10 @@ func (t *Table) ToString() ([]string, error) { indexList = append(indexList, indexStr) } replaceTable[TableFieldList] = strings.Join(fieldList, ",") - replaceTable[TableIndexList] = strings.Join(indexList, ",") + if len(indexList) > 0 && consts.DatabaseDriverMysql == DatabaseDriver { + replaceTable[TableIndexList] = "," + strings.Join(indexList, ",") + indexList = make([]string, 0) + } if len(t.Engine) > 0 { replaceTable[TableEngine] = "ENGINE=" + t.Engine