From b1fd75fc953c2419425e08132143f56aa6687d31 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sun, 11 Oct 2020 23:35:15 +0800 Subject: [PATCH] add tag on_update --- dialects/dialect.go | 9 +++++++++ dialects/mysql.go | 4 +++- schemas/column.go | 1 + session_schema.go | 1 + tags/tag.go | 45 ++++++++++++++++++++++++++------------------- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index dc96f73a..e57961b6 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -280,5 +280,14 @@ func ColumnString(dialect Dialect, col *schemas.Column, includePrimaryKey bool) } } + if col.IsOnUpdate { + if _, err := bd.WriteString("ON UPDATE CURRENT_TIMESTAMP"); err != nil { + return "", err + } + if err := bd.WriteByte(' '); err != nil { + return "", err + } + } + return bd.String(), nil } diff --git a/dialects/mysql.go b/dialects/mysql.go index 5f1d28e5..10332b26 100644 --- a/dialects/mysql.go +++ b/dialects/mysql.go @@ -414,7 +414,9 @@ func (db *mysql) GetColumns(queryer core.Queryer, ctx context.Context, tableName if extra == "auto_increment" { col.IsAutoIncrement = true } - + if strings.Contains(extra, "ON UPDATE CURRENT_TIMESTAMP") { + col.IsOnUpdate = true + } if !col.DefaultIsEmpty { if !alreadyQuoted && col.SQLType.IsText() { col.Default = "'" + col.Default + "'" diff --git a/schemas/column.go b/schemas/column.go index db66a3a6..28592aa5 100644 --- a/schemas/column.go +++ b/schemas/column.go @@ -30,6 +30,7 @@ type Column struct { Length2 int Nullable bool Default string + IsOnUpdate bool Indexes map[string]int IsPrimaryKey bool IsAutoIncrement bool diff --git a/session_schema.go b/session_schema.go index 9ccf8abe..b6afcba4 100644 --- a/session_schema.go +++ b/session_schema.go @@ -296,6 +296,7 @@ func (session *Session) Sync2(beans ...interface{}) error { for _, col2 := range oriTable.Columns() { if strings.EqualFold(col.Name, col2.Name) { oriCol = col2 + oriCol.IsOnUpdate = col.IsOnUpdate break } } diff --git a/tags/tag.go b/tags/tag.go index ee3f1e82..b96e145b 100644 --- a/tags/tag.go +++ b/tags/tag.go @@ -57,25 +57,26 @@ type Handler func(ctx *Context) error var ( // defaultTagHandlers enumerates all the default tag handler defaultTagHandlers = map[string]Handler{ - "<-": OnlyFromDBTagHandler, - "->": OnlyToDBTagHandler, - "PK": PKTagHandler, - "NULL": NULLTagHandler, - "NOT": IgnoreTagHandler, - "AUTOINCR": AutoIncrTagHandler, - "DEFAULT": DefaultTagHandler, - "CREATED": CreatedTagHandler, - "UPDATED": UpdatedTagHandler, - "DELETED": DeletedTagHandler, - "VERSION": VersionTagHandler, - "UTC": UTCTagHandler, - "LOCAL": LocalTagHandler, - "NOTNULL": NotNullTagHandler, - "INDEX": IndexTagHandler, - "UNIQUE": UniqueTagHandler, - "CACHE": CacheTagHandler, - "NOCACHE": NoCacheTagHandler, - "COMMENT": CommentTagHandler, + "<-": OnlyFromDBTagHandler, + "->": OnlyToDBTagHandler, + "PK": PKTagHandler, + "NULL": NULLTagHandler, + "NOT": IgnoreTagHandler, + "AUTOINCR": AutoIncrTagHandler, + "DEFAULT": DefaultTagHandler, + "CREATED": CreatedTagHandler, + "UPDATED": UpdatedTagHandler, + "DELETED": DeletedTagHandler, + "VERSION": VersionTagHandler, + "UTC": UTCTagHandler, + "LOCAL": LocalTagHandler, + "NOTNULL": NotNullTagHandler, + "INDEX": IndexTagHandler, + "UNIQUE": UniqueTagHandler, + "CACHE": CacheTagHandler, + "NOCACHE": NoCacheTagHandler, + "COMMENT": CommentTagHandler, + "ON_UPDATE": OnUpdateTagHandler, } ) @@ -215,6 +216,12 @@ func UniqueTagHandler(ctx *Context) error { return nil } +// OnUpdateTagHandler +func OnUpdateTagHandler(ctx *Context) error { + ctx.col.IsOnUpdate = true + return nil +} + // CommentTagHandler add comment to column func CommentTagHandler(ctx *Context) error { if len(ctx.params) > 0 {