Skip to content

SamuelTissot/sqltime

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sqltime

A time.Time wrapper compatible with databases timestamp type.

Issue

Most database timestamp have a resolution of microseconds while Go time.Time has a resolution of nanoseconds.

postgres mysql

The resolution difference causes a data loss, so when a record is inserted into the database and retrieve the timestamp differs.

For testing, it gets quite annoying since you can't use reflect.DeepEqual to compare the two record ( original and the one fetch from the database)

Moreover, most of the time, there is the issue of Location. sqltime will set the timestamp to the right database location. The default database location is UTC, but it can easily be changed with:

sqltime.DatabaseLocation, _ = time.LoadLocation([YOUR_LOCATION])

Solution

Wrapping the time.Time type to truncate the time to database resolution. By default, it will truncate the nanoseconds

The resolution can be changed with:

sqltime.Truncate = time.Microsecond

example

see a full example here. The example assumes that the database is set to the default timezone of UTC if not please update the sqltime.DatabaseLocation.

Usage with with GORM

It is particularly useful with ORM's like GORM

But instead of extending the gorm.Model you declare your base.

package Model

import "github.com/SamuelTissot/sqltime"

// define the model
type Model struct {
	ID         uint `gorm:"primary_key"`
	CreatedAt sqltime.Time  `gorm:"type:timestamp"`
	UpdatedAt sqltime.Time  `gorm:"type:timestamp"`
	DeletedAt *sqltime.Time `gorm:"type:timestamp"`
}

// and use it like this
type MyModel struct {
	BaseModel
	Data string
}