1/3
go
IANAのgo
に複製しようとしています。 @MattJohnsonが指摘したように、クライアントは信頼できないことがわかっています。
2/3
database/sql.DB
-Open(drv, DSN)
を介して作成 -同じDSN
を使用します すべての接続に対して。 sql.DB
一度作成して何度も使用することを目的としています-DSN
を変更する方法はありません 事後-新しいsql.DB
を作成する必要があります DSN
を変更する場合 。
3/3
したがって、より良いタックは、MySQL
を活用しているように見えます すべてのdatetime
を変換します クライアントに送信する前のローカルからUTCタイムゾーンまでの値。これにより、DSN
を介した接続時にデータベースの(おそらく不明な)タイムゾーンを設定する煩わしさがなくなります。 。
有望なオプションの1つは、接続のセッションタイムゾーンを設定することです。
-
SET @@session.time_zone = "+00:00";
- ただし、これは現在でのみ機能します 接続(接続プール内)。
go
ただし、クライアントはいつでもどの無料接続を使用しているのかわかりません。 - したがって、これが常に機能するようにするには、すべてのクエリの前に手動で適用する必要があります。 。 1つのDB接続のみが使用されている場合でも(接続が失敗して接続の再試行が開始された場合)、以前のセッション状態はすべて失われます。
したがって、代わりに、すべてのdatatime
をラップします 次のような変換関数を持つ列:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
タイムゾーンの計算がクエリ時に行われ、接続の再接続などで失われないようにします。
だから今DSN
loc
を指定する必要がなくなりました -UTC
として デフォルトです。実際、DSN
?parseTime=true
のサフィックスオプションのみが必要です datetime
を許可する go
に変換されます のネイティブtime.Time
。
最後に、そして最も重要なこととして、これは任意のタイムゾーンに設定された任意のサーバーで機能します。
この