Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为什么空字符串值在更新时不起作用?_Postgresql_Go_Sqlboiler - Fatal编程技术网

Postgresql 为什么空字符串值在更新时不起作用?

Postgresql 为什么空字符串值在更新时不起作用?,postgresql,go,sqlboiler,Postgresql,Go,Sqlboiler,我使用从SQL生成Go模型,遇到了以下问题。通过SQLBuilter代码指定冲突上的时: dev:=models.Device{ ID:deviceID, 类型:null.StringFrom(“设备”), //名称:null.StringFrom(“”), //别名:null.StringFrom(“”), } err=dev.Upsert(context.Background(), db, 是的, []字符串{“id”}, 白名单(“名称”、“别名”、“类型”), 白名单(“id”、“名称”

我使用从SQL生成Go模型,遇到了以下问题。通过SQLBuilter代码指定冲突上的
时:

dev:=models.Device{
ID:deviceID,
类型:null.StringFrom(“设备”),
//名称:null.StringFrom(“”),
//别名:null.StringFrom(“”),
}
err=dev.Upsert(context.Background(),
db,
是的,
[]字符串{“id”},
白名单(“名称”、“别名”、“类型”),
白名单(“id”、“名称”、“别名”、“类型”),
)
我得到以下查询:

INSERT INTO "devices" ("id", "type") VALUES ($1,$2) ON CONFLICT ("id") DO UPDATE SET "type" = EXCLUDED."type","updated" = EXCLUDED."updated"
[60b16bd2890814e5 {device true} ]
以及以下错误:(
X
因为缩小了示例)

当我用注释过的代码初始化
Name
Alias
时,一切正常。为什么我需要初始化它?为什么零值不能在这种情况下工作

编辑

添加
设备
定义:

导入(
“github.com/volatiletech/null”
)
//类型StringArray[]字符串
//类型PropertyMap[字符串]接口{}
// ...
类型设备结构{
ID字符串`boil:ID“json:ID”toml:ID“yaml:ID”`
Type null.String`boil:“Type”json:“Type,omitempty”toml:“Type”yaml:“Type,omitempty”`
Status null.String`boil:“Status”json:“Status,omitempty”toml:“Status”yaml:“Status,omitempty”`
Name null.String`boil:“Name”json:“Name,omitempty”toml:“Name”yaml:“Name,omitempty”`
Alias null.String`boil:“Alias”json:“Alias,omitempty”toml:“Alias”yaml:“Alias,omitempty”`
舰队字符串`boil:“舰队”json:“舰队”toml:“舰队”yaml:“舰队”`
硬件字符串`boil:“硬件”json:“硬件”toml:“硬件”yaml:“硬件”`
DeviceToken字符串`boil:“设备令牌”json:“设备令牌”toml:“设备令牌”yaml:“设备令牌”`
Tags types.StringArray`boil:“Tags”json:“Tags,omitempty”toml:“Tags”yaml:“Tags,omitempty”`
Properties models.PropertyMap`boil:“Properties”json:“Properties,omitempty”toml:“Properties”yaml:“Properties,omitempty”`
创建时间。time`boil:“创建”json:“创建”toml:“创建”yaml:“创建”`
Updated null.Time`boil:“Updated”json:“Updated,omitempty”toml:“Updated”yaml:“Updated,omitempty”`
R*deviceR`boil:“-”json:“-”toml:“-”yaml:“-”`
设备'boil:“-”json:“-”toml:“-”yaml:“-”`
}
upert

//已生成
func(o*设备)Upsert(ctx context.context,exec bool.ContextExecutor,updateOnConflict bool,conflictColumns[]字符串,updateColumns,insertColumns BOLL.Columns)错误{
如果o==nil{
返回错误。新建(“型号:未为upsert提供设备”)
}
如果错误:=o.doBeforeUpsertHooks(ctx,exec);错误!=nil{
返回错误
}
nzDefaults:=querys.NonZeroDefaultSet(deviceColumnsWithDefault,o)
//构建缓存密钥在线Uglly-mysql与psql问题
buf:=strmangle.GetBuffer()
如果更新冲突{
buf.WriteByte('t')
}否则{
buf.WriteByte('f')
}
buf.WriteByte('.'))
对于u,c:=范围冲突列{
buf.书面限制(c)
}
buf.WriteByte('.'))
buf.WriteString(strconv.Itoa(updateColumns.Kind))
对于uC:=范围updateColumns.Cols{
buf.书面限制(c)
}
buf.WriteByte('.'))
buf.WriteString(strconv.Itoa(insertColumns.Kind))
对于,c:=范围insertColumns.Cols{
buf.书面限制(c)
}
buf.WriteByte('.'))
对于u,c:=范围nzDefaults{
buf.书面限制(c)
}
键:=buf.String()
strMagle.PutBuffer(buf)
deviceUpsertCacheMut.RLock()
缓存,缓存:=deviceUpsertCache[键]
deviceUpsertCacheMut.RUnlock()
变量错误
如果!缓存{
insert,ret:=INSERTRCOLUMNS.INSERTRCOLUMNSET(
设备所有列,
deviceColumnsWithDefault,
没有默认设置的设备列,
新西兰违约,
)
更新:=updateColumns.UpdateColumnSet(
设备所有列,
DevicePrimary键列,
)
如果updateOnConflict&&len(更新)==0{
返回错误。新建(“型号:无法升级设备,无法生成更新列列表”)
}
冲突:=冲突列
如果len(冲突)==0{
冲突=生成([]字符串,len(devicePrimaryKeyColumns))
复制(冲突,devicePrimaryKeyColumns)
}
cache.query=buildUpsertQueryPostgres(方言,“\”设备\”,updateOnConflict,ret,update,conflict,insert)
cache.valueMapping,err=querys.BindMapping(deviceType,deviceMapping,insert)
如果错误!=零{
返回错误
}
如果len(ret)!=0{
cache.retMapping,err=querys.BindMapping(deviceType,deviceMapping,ret)
如果错误!=零{
返回错误
}
}
}
值:=reflect.Indirect(reflect.ValueOf(o))
VAL:=查询.ValuesFromMapping(值,缓存.valueMapping)
var返回[]接口{}
如果len(cache.retMapping)!=0{
返回=querys.PtrsFromMapping(值,cache.retMapping)
}
如果是沸腾,则为沸腾(ctx){
writer:=boil.DebugWriterFrom(ctx)
fmt.Fprintln(writer,cache.query)
fmt.Fprintln(撰稿人,VAL)
}
如果len(cache.retMapping)!=0{
err=exec.QueryRowContext(ctx、cache.query、vals…).Scan(返回…)
如果err==sql.ErrNoRows{
err=nil//Postgres在没有更新时不返回任何内容
}
}否则{
_,err=exec.ExecContext(ctx、cache.query、vals…)
}
如果错误!=零{
返回错误。Wrap(错误,“型号:无法插入设备”)
}
如果!缓存{
deviceUpsertCacheMut.Lock()
deviceUpsertCache[键]=缓存
deviceUpsertCacheMut.Unlock()
}
返回o.doAfterUpsertHooks(ctx,exec)
}
该sql查询不会重新启动
sql: Scan error on column index X, name \"name\": converting NULL to string is unsupported'