postgresql使用gorm遇到的问题

[TOC]

背景

最近接手了一个使用postgresql的项目,说真的,第一次在项目中使用。
我使用的是iris+gorm, 踩到了坑,花了一天才解决。
gorm是不支持postgrel的Array字段和json字段的。

Array字段问题

解决办法是使用github.com/lib/pq

使用示例

package models

import "github.com/lib/pq"

type Info struct {
    ID  uint64
    Title *string `gorm:"not null"`
    Pic pq.StringArray `gorm:"type:varchar(100)[]"`
}

JSON 字段问题

解决办法是自定义一个JSON类型, 在gorm的issue中找到的。

type JSON []byte
func (j JSON) Value() (driver.Value, error) {
    if j.IsNull() {
        return nil, nil
    }
    return string(j), nil
}
func (j *JSON) Scan(value interface{}) error {
    if value == nil {
        *j = nil
        return nil
    }
    s, ok := value.([]byte)
    if !ok {
        errors.New("Invalid Scan Source")
    }
    *j = append((*j)[0:0], s...)
    return nil
}
func (m JSON) MarshalJSON() ([]byte, error) {
    if m == nil {
        return []byte("null"), nil
    }
    return m, nil
}
func (m *JSON) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("null point exception")
    }
    *m = append((*m)[0:0], data...)
    return nil
}
func (j JSON) IsNull() bool {
    return len(j) == 0 || string(j) == "null"
}
func (j JSON) Equals(j1 JSON) bool {
    return bytes.Equal([]byte(j), []byte(j1))
}

使用示例

package models

import "github.com/lib/pq"

type Info struct {
    PubRes JSON  `sql:"type:json" json:"object,omitempty"`
    AuditRes string
}

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注