我正在使用一个外部的JSON API,它在处理丢失值时表现不一致。有时JSON值显示为空字符串,而其他时候则为null。例如...
情况1:datedec
和curr
都是空字符串。
{
"symbol": "XYZ",
"dateex": "2020-09-01",
"datedec": "",
"amount": "1.25",
"curr": "",
"freq": "annual"
}
案例2:
datedec
为空。 curr
已填充。{
"symbol": "XYZ",
"dateex": "2020-09-01",
"datedec": null,
"amount": "1.25",
"curr": "USD",
"freq": "annual"
}
这是我用来表示股息的结构体:
type Dividend struct {
symbol string `json:"symbol"`
dateex string `json:"dateex"`
datedec string `json:"datedec"`
amount string `json:"amount"`
curr string `json:"curr"`
freq string `json:"freq"`
}
我遇到的问题是如何将空字符串或 null 插入数据库作为
NULL
。我知道可以使用 omitempty
json 标签,但是如果我不知道值是否缺失,该如何编写处理函数?例如,这是我的当前函数,使用 jackc/pgx 包将分红插入 postgresql:func InsertDividend(d Dividend) error {
sql := `INSERT INTO dividends
(symbol, dateex, datedec, amount, curr, freq)
VALUES ($1, $2, $3, $4, $5, $6)`
conn, err := pgx.Connect(ctx, "DATABASE_URL")
// handle error
defer conn.Close(ctx)
tx, err := conn.Begin()
// handle error
defer tx.Rollback(ctx)
_, err = tx.Exec(ctx, sql, d.symbol, d.dateex, d.datedec, d.amount, d.curr, d.freq)
// handle error
}
err = tx.Commit(ctx)
// handle error
return nil
}
如果某个值(如datedec或curr)缺失,则此函数将报告错误。从这篇文章Golang Insert NULL into sql instead of empty string中,我了解到如何解决Case1的问题。但是是否有一种更通用的方法来处理两种情况(null或空字符串)?
我一直在查阅database/sql和jackc/pgx文档,但还没有找到任何答案。我认为sql.NullString可能有潜力,但我不确定该如何做。
任何建议都将不胜感激。谢谢!
""
转换为sql.NullString
的函数。你可以将任何想要转换的变量包装在该函数中:_, err = tx.Exec(ctx, sql, d.symbol, d.dateex, NewNullString(d.datedec), d.amount, NewNullString(d.curr), d.freq)
。这个方法不会在你的情况下起作用吗? - phonaputerNULLIF
。例如:INSERT INTO dividends (... datedec, ...) VALUES (... NULLIF($3, ''), ...)
- mkoprivaNULLIF
函数返回它的第一个参数值,如果它不匹配第二个参数。如果第一个参数是NULL
而第二个参数是''
(空字符串),那么它将返回第一个参数,即NULL
。因此,是的,当$3
是NULL
或者$3
是''
(空字符串)时,NULLIF($3, '')
都会返回NULL
。 - mkopriva