Используйте отметку времени unix для поля «Обновлено» в gorm - PullRequest
0 голосов
/ 31 марта 2020

Я пишу приложение, которое связывается с базой данных sqlite3 с помощью GORM ORM. Теперь мне нужно сделать UpdatedAt столбец отметкой времени unix, потому что другое устаревшее приложение использует ту же базу данных, и они должны быть совместимы.

Поэтому я попытался обновить поле UpdatedAt с помощью unix отметка времени на BeforeUpdate перехватывается с использованием следующего блока кода.

func (c *CartItems) BeforeUpdate() (err error) {
    fmt.Println("----------------------------------------")
    fmt.Println("BeforeUpdate")
    fmt.Println( c )
    c.UpdatedAt = time.Now().Unix()
    fmt.Println("----------------------------------------")
    return
}

, но при запуске запрос кода остается прежним и не добавляет отметку времени в базу данных.

журнал Горм

----------------------------------------
BeforeUpdate
&{55 21 4 7 1585607114 1585607114 {0 [] [] [] {0 0 } 0 0} {0  0 0 0}}
----------------------------------------

[2020-03-31 04:30:02]  [0.46ms]  UPDATE "cart_items" SET "quantity" = 7, "updated_at" = '2020-03-31 04:30:02'  WHERE "cart_items"."id" = 55  
[1 rows affected or returned ] 
[GIN] 2020/03/31 - 04:30:02 | 200 |   97.963597ms |       127.0.0.1 | POST     "/cache/cart/21/item"

1 Ответ

2 голосов
/ 31 марта 2020

Используйте следующее, если вы хотите, чтобы UpdatedAt() и CreatedAt() были unix метками времени.

type CartItems struct {
    CreatedAt int64
    UpdatedAt int64
}

func (m *CartItems) BeforeUpdate(scope *gorm.Scope) error {
    scope.SetColumn("UpdatedAt", time.Now().Unix())
    return nil
}

func (m *CartItems) BeforeCreate(scope *gorm.Scope) error {
    if m.UpdatedAt == 0 {
        scope.SetColumn("UpdatedAt", time.Now().Unix())
    }

    scope.SetColumn("CreatedAt", time.Now().Unix())
    return nil
}

К сожалению, gorm недостаточно хорошо задокументировано, поэтому вам придется прочитать код чтобы понять, как это работает, а именно эта строка вызывает вышеуказанную функцию BeforeUpdate().

Как вы можете видеть в функции callMethod(), она проверяет подпись функции в switch, чтобы решить, как вызывать функцию.

...