首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用gorm的sqlite时间列

使用gorm的sqlite时间列
EN

Stack Overflow用户
提问于 2018-05-09 17:17:22
回答 2查看 4.6K关注 0票数 3

我正在尝试从sqlite查询对象,但是由于类型时间,我得到了这个错误:

代码语言:javascript
运行
复制
(sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *time.Time)

我的结构是:

代码语言:javascript
运行
复制
type Timeline struct {
ID        string     `json:"id"`
Timestamp *time.Time `json:"timestamp"`

我的数据库是这样的:

代码语言:javascript
运行
复制
CREATE TABLE timelines (id text, timestamp text, ...

其中的一个示例行是:

代码语言:javascript
运行
复制
('Locked in VR', '2018-03-17 10:50:59.548+01:00',...

有什么想法吗?我应该在结构里放点东西吗?

代码语言:javascript
运行
复制
Timestamp *time.Time `json:"timestamp" gorm:"time"`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-09 19:39:04

我不熟悉gorm,但是datetime类型的时间戳的定义不应该代替text吗?另外:在标记gorm:"time"时,列名应该是time,而不是timestamp,或者标记gorm:"timestamp"。但你可以省去戈姆的标签。

为了简单起见,您可以让gorm创建表:

代码语言:javascript
运行
复制
db, err := gorm.Open("sqlite3", "test.db")
db.CreateTable(&Timeline{})
票数 5
EN

Stack Overflow用户

发布于 2018-09-03 18:22:12

使用它可以解决这个问题:

代码语言:javascript
运行
复制
type Timeline struct {
    ID        string     `json:"id"`
    Timestamp *time.Time `json:"timestamp" gorm:"type:datetime"`
}

您甚至可以将声明的Timestamp字段类型更改为其他类型,比如表示Unix时间的int64。然后,您可以编写一个扫描程序,将日期时间字段读入int64字段。

代码语言:javascript
运行
复制
type TimeStampUnix int64
type Timeline struct {
    ID        string        `json:"id"`
    TimeStamp TimeStampUnix `json:"timestamp" gorm:"type:datetime"`
}

func (t *TimeStampUnix) Scan(src interface{}) error {
    switch src.(type) {
    case time.Time:
        *t = TimeStampUnix(src.(time.Time).Unix())
        return nil
    case []byte:
        // bonus code to read text field of format '2014-12-31 14:21:01-0400'
        //
        str := string(src.([]byte))
        var y, m, d, hr, min, s, tzh, tzm int
        var sign rune
        _, e := fmt.Sscanf(str, "%d-%d-%d %d:%d:%d%c%d:%d",
            &y, &m, &d, &hr, &min, &s, &sign, &tzh, &tzm)
        if e != nil {
            return e
        }

        offset := 60 * (tzh*60 + tzm)
        if sign == '-' {
            offset = -1 * offset
        }

        loc := time.FixedZone("local-tz", offset)
        t1 := time.Date(y, time.Month(m), d, hr, min, s, 0, loc)
        *t = TimeStampUnix(t1.Unix())
        return nil
    default:
        return fmt.Errorf("Value '%s' of incompatible type '%T' found", string(src.([]byte)), src)
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50258820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档