デフォルトのタイムスタンプは、異なるmysqlテーブルの異なるタイムゾーンのものです

Shudipta Sharma:

サーバーのバージョンとgormパッケージ:

❯ docker exec -it mysql mysqld --version
mysqld  Ver 5.7.29 for Linux on x86_64 (MySQL Community Server (GPL))

❯ docker exec -it mysql mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper
import "github.com/jinzhu/gorm"

2つのテーブル:

mysql> desc t1;
+------------+-------------------+------+-----+-------------------+----------------+
| Field      | Type              | Null | Key | Default           | Extra          |
+------------+-------------------+------+-----+-------------------+----------------+
| ...        |                   |      |     |                   |                |
| created_at | timestamp         | YES  |     | CURRENT_TIMESTAMP |                |
+------------+-------------------+------+-----+-------------------+----------------+

mysql> desc t2;
+----------------+------------------+------+-----+-------------------+----------------+
| Field          | Type             | Null | Key | Default           | Extra          |
+----------------+------------------+------+-----+-------------------+----------------+
| ...            | ...              | ...  | ... | ...               | ...            |
| initiated_at   | timestamp        | YES  |     | CURRENT_TIMESTAMP |                |
+----------------+------------------+------+-----+-------------------+----------------+

gorm定義中モデルstuct{}は次のとおりです。

// t1
type T1 struct {
    ID uint `gorm:"primary_key"`
    // others are here
    // ...

    CreatedAt  time.Time `gorm:"timestamp;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at" query:"created_at" sql:"DEFAULT:current_timestamp"`
}

// t2 ...
type T2 struct {
    ID uint `gorm:"primary_key"`
    // others are here
    // ...
    InitiatedAt  time.Time `gorm:"timestamp;default:CURRENT_TIMESTAMP" json:"initiated_at" form:"initiated_at" query:"initiated_at" sql:"DEFAULT:current_timestamp"`
}

初期化されていないタイムスタンプで挿入

dbSource := fmt.Sprintf(
    "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
    cnf.Username,
    cnf.Password,
    cnf.Host,
    cnf.Port,
    cnf.DBName,
)

db, err := gorm.Open("mysql", dbSource)
if err != nil {
    logrus.Warn("Got error when connect database:", err)
    return err
}

t1 := T1{} // created_at is not set
t2 := T2{} // initiated_at is not set

tx := db.Begin()
defer func() {
    if r := recover(); r != nil {
        logrus.Error("Rolling back")
        tx.Rollback()
    }
}()
// If failed to begin transaction
if err := tx.Error; err != nil {
    return err
}

if err := db.Create(&t1).Error; err != nil {
    logrus.Warn(err)
    // rollback the transaction in case of error
    tx.Rollback()
    return derror.ErrorBadRequest
}
if err := db.Create(&t2).Error; err != nil {
    logrus.Warn(err)
    // rollback the transaction in case of error
    tx.Rollback()
    return derror.ErrorBadRequest
}

// Or commit the transaction
if err := tx.Commit().Error; err != nil {
    logrus.Warn(err)
    // rollback the transaction in case of error
    tx.Rollback()
    return derror.ErrorBadRequest
}

何を選択クエリを実行するか

mysql> select * from t1;
+-----+---------------------+
| ... | created_at          |
+-----+---------------------+
| ... | 2020-03-24 02:38:26 |
+-----+---------------------+

mysql> select * from t2;
+-----+---------------------+
| ... | initiated_at        |
+-----+---------------------+
| ... | 2020-03-23 20:38:26 |
+-----+---------------------+

期待:

asia/dhaka(+06:00)リージョンにいることに注意してくださいそして、の時間created_att1テーブルには、私の地域のBST現在の時刻です。一方、時間initiated_att2テーブルには、UTC現在の時刻です。

しかし、私は両方の時間が同じであることを期待しています(つまり、UTCまたはBSTのどちらかです)。

知りたい:

  • 2つの時間の地域が異なる理由。
  • 両方の時間が同じ地域であるような解決策
ロノ:

表ではt1を使用してからローカルタイムゾーンCreatedAt設定しGormますloc=Local

参照:https : //github.com/jinzhu/gorm/blob/master/callback_create.go#L32

そして表にt2initiated_atで設定されていないGorm、それはによって設定されMysqlますが、デフォルト値を使用するので、CURRENT_TIMESTAMPの中でMySql

解決:

接続でGormタイムゾーンをUTCに変更できloc=UTCます。

または

ローカルタイムゾーンをMysqlタイムゾーンとして設定できますは、time.Time値の場所を設定しますが、MySQLのtime_zone設定は変更しないことに注意してください。そのためには、DSNパラメータとして設定することもできるtime_zoneシステム変数を参照してください。

参照:https : //github.com/go-sql-driver/mysql#loc

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アイテムのタイムゾーンが異なるリストに日付フィルターを実装する良い方法は何ですか?

分類Dev

異なるタイムゾーンでのデータの表示

分類Dev

MySQL:異なるテーブル行の2つのタイムスタンプの差を計算します

分類Dev

Oracle dbは、異なるタイムゾーンのタイムスタンプを比較できますか?

分類Dev

SQLはタイムスタンプで2つの異なるテーブルを結合します

分類Dev

同じ時間のUnixタイムスタンプが異なるタイムゾーンで異なる理由

分類Dev

`tz = NULL`のようなものを使用することは可能ですか?...` as.POSIXct`はデフォルトでロケール依存のタイムゾーン( `as.Date`とは異なります)になり、問題が発生します

分類Dev

ローカルテストのためにブラウザとサーバー間で異なるタイムゾーンをシミュレートする

分類Dev

典型的なLinux(もしあれば)のデフォルトのタイムゾーンは何ですか?

分類Dev

ランタイムクラスは同じで静的タイプが異なるオブジェクトのパフォーマンスが異なる

分類Dev

C#ASP.NETWebフォームの異なるテーブルタイプ

分類Dev

current_timestampとは異なるタイムスタンプのデフォルト値

分類Dev

フォームの複数のインスタンスで異なるデータを送信する

分類Dev

異なるタイムゾーンのタイム配列のタイムスタンプ減算

分類Dev

サーバーとは異なるタイムゾーンを持つMySQLの日付フィールドからUNIXタイムスタンプを選択するにはどうすればよいですか?

分類Dev

MySQLのタイムスタンプとは異なる日時、日付、時刻フィールドの値

分類Dev

HTMLテーブルで異なるスタイルのスタックフォント

分類Dev

タイムスタンプ列が異なるSQLServerの単一テーブルの行を削除します

分類Dev

タイムスタンプで2つの異なるデータフレームを結合する

分類Dev

2つのFTPサーバー上の分散ファイルシステムは2つの異なるデータセンターで機能しますか?

分類Dev

日付値(文字列)を異なるタイムゾーンのタイムスタンプに変換する

分類Dev

MMCスナップインから表示すると、フォームのスタイルが異なります

分類Dev

異なるプラットフォームでAmazonec2のインスタンスを予約する

分類Dev

bashとtcshファイルのタイムスタンプが異なるのはなぜですか?

分類Dev

システムのデフォルトのタイムゾーンの時間を取得する

分類Dev

異なるタイムゾーンでデータベースレコードをテストする方法は?

分類Dev

UNIXタイムスタンプでのデフォルトのタイムゾーンの設定

分類Dev

同じパンダのDatetimeIndexオブジェクトに異なるタイムゾーンのタイムスタンプがありますか?

分類Dev

異なる日付エントリを処理するiOSアプリの異なるタイムゾーン

Related 関連記事

  1. 1

    アイテムのタイムゾーンが異なるリストに日付フィルターを実装する良い方法は何ですか?

  2. 2

    異なるタイムゾーンでのデータの表示

  3. 3

    MySQL:異なるテーブル行の2つのタイムスタンプの差を計算します

  4. 4

    Oracle dbは、異なるタイムゾーンのタイムスタンプを比較できますか?

  5. 5

    SQLはタイムスタンプで2つの異なるテーブルを結合します

  6. 6

    同じ時間のUnixタイムスタンプが異なるタイムゾーンで異なる理由

  7. 7

    `tz = NULL`のようなものを使用することは可能ですか?...` as.POSIXct`はデフォルトでロケール依存のタイムゾーン( `as.Date`とは異なります)になり、問題が発生します

  8. 8

    ローカルテストのためにブラウザとサーバー間で異なるタイムゾーンをシミュレートする

  9. 9

    典型的なLinux(もしあれば)のデフォルトのタイムゾーンは何ですか?

  10. 10

    ランタイムクラスは同じで静的タイプが異なるオブジェクトのパフォーマンスが異なる

  11. 11

    C#ASP.NETWebフォームの異なるテーブルタイプ

  12. 12

    current_timestampとは異なるタイムスタンプのデフォルト値

  13. 13

    フォームの複数のインスタンスで異なるデータを送信する

  14. 14

    異なるタイムゾーンのタイム配列のタイムスタンプ減算

  15. 15

    サーバーとは異なるタイムゾーンを持つMySQLの日付フィールドからUNIXタイムスタンプを選択するにはどうすればよいですか?

  16. 16

    MySQLのタイムスタンプとは異なる日時、日付、時刻フィールドの値

  17. 17

    HTMLテーブルで異なるスタイルのスタックフォント

  18. 18

    タイムスタンプ列が異なるSQLServerの単一テーブルの行を削除します

  19. 19

    タイムスタンプで2つの異なるデータフレームを結合する

  20. 20

    2つのFTPサーバー上の分散ファイルシステムは2つの異なるデータセンターで機能しますか?

  21. 21

    日付値(文字列)を異なるタイムゾーンのタイムスタンプに変換する

  22. 22

    MMCスナップインから表示すると、フォームのスタイルが異なります

  23. 23

    異なるプラットフォームでAmazonec2のインスタンスを予約する

  24. 24

    bashとtcshファイルのタイムスタンプが異なるのはなぜですか?

  25. 25

    システムのデフォルトのタイムゾーンの時間を取得する

  26. 26

    異なるタイムゾーンでデータベースレコードをテストする方法は?

  27. 27

    UNIXタイムスタンプでのデフォルトのタイムゾーンの設定

  28. 28

    同じパンダのDatetimeIndexオブジェクトに異なるタイムゾーンのタイムスタンプがありますか?

  29. 29

    異なる日付エントリを処理するiOSアプリの異なるタイムゾーン

ホットタグ

アーカイブ