假設我有一個顯示帖子串列的網路應用程式。帖子結構是:
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列)
uj5u.com熱心網友回復:
您應該能夠通過調整 SQL 查詢以回傳您想要填充的確切欄位來實作您想要的行為。
SELECT Id , Title , Body FROM posts;
這樣,即使您添加另一列Author,查詢結果也只包含 3 個值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/322110.html
上一篇:登錄頁面,想檢查現有用戶
下一篇:MySQL中的子查詢
