我们有一个go应用程序,使用Postgres作为后端数据库。我们使用https://github.com/jmoiron/sqlx用于与DB通信。从表中读取所有行的代码如下:
rows, err := repo.db.Queryx(ListNodesQuery)
if err != nil {
repo.logger.Log("method", "ListNodes", "error", err)
return nil, err
}
r := []*Node{}
for rows.Next() {
var n Node
err = rows.StructScan(&n)
}
在DB中添加一个新列后,预期的代码错误如下
missing destination name type in *Node
因为db表有更多的列。当然,更改代码以同时更新结构是不可能的。
我发现关闭这个错误的一种方法是使用数据库。此处记录的不安全
有没有其他惯用的方法来处理这种情况?
当然可以通过更改代码来同时更新结构不可能。
您可以在代码库中管理数据库架构,并拥有一些应用程序启动代码,可以自动将数据库迁移到最新的架构版本,以保持代码和数据库同步。
其中一个选项是github.com/golang-mister.
在应用程序启动时运行此代码,将DB架构更新到最新版本:
migrate, err := migrate.New("folder to sql scrips", "db connection string")
if err != nil {
logger.Panic(err)
}
err = migrate.Up()
if err != nil {
logger.Panic(err)
}