【发布时间】:2021-12-05 01:48:36
【问题描述】:
假设我有一个显示帖子列表的网络应用。帖子结构是:
type Post struct {
Id int64 `sql:",primary"`
Title string
Body string
}
它检索帖子:
var posts []*Post
rows, err := db.QueryContext(ctx, "select * from posts;")
if err != nil {
return nil, oops.Wrapf(err, "could not get posts")
}
defer rows.Close()
for rows.Next() {
p := &Post{}
err := rows.Scan(
&p.Id,
&p.Title,
&p.Body,
)
if err != nil {
return nil, oops.Wrapf(err, "could not scan row")
}
posts = append(posts, p)
}
return posts, nil
一切正常。现在,我想通过添加一列来更改表架构:
ALTER TABLE posts ADD author varchar(62);
突然,获取帖子的请求导致:
sql: expected 4 destination arguments in Scan, not 3
这是有道理的,因为该表现在有 4 列,而不是检索逻辑规定的 3 列。
然后我可以将结构更新为:
type Post struct {
Id int64 `sql:",primary"`
Title string
Body string
Author string
}
和检索逻辑是:
for rows.Next() {
p := &Post{}
err := rows.Scan(
&p.Id,
&p.Title,
&p.Body,
&p.Author
)
if err != nil {
return nil, oops.Wrapf(err, "could not scan row")
}
posts = append(posts, p)
}
解决了这个问题。但是,这意味着在迁移和逻辑更新 + 部署之间总会有一段停机时间。如何避免停机?
我尝试交换上述更改的顺序,但这不起作用,同样的请求导致:
sql: expected 3 destination arguments in Scan, not 4
(这是有道理的,因为该表当时只有 3 列而不是 4 列);
以及其他导致:
Error 1054: Unknown column 'author' in 'field list'
(这是有道理的,因为此时posts 表还没有author 列)
【问题讨论】: