1

我们有一个使用 Postgres 作为后端数据库的 go 应用程序。我们使用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)
 }

在数据库中添加新列后,代码按预期错误如下

missing destination name type in *Node

因为 db 表有更多的列。更改代码以同时更新结构当然是不可能的。

我看到关闭此错误的一种方法是使用此处记录的db.Unsafe

有没有其他惯用的方法来处理这种情况?

4

1 回答 1

0

更改代码以同时更新结构当然是不可能的。

您可以在代码库中管理数据库架构,并拥有一些应用程序启动代码,这些代码会自动将数据库迁移到最新的架构版本,以保持代码和数据库同步。

选项之一是github.com/golang-migrate

在 app start 上运行此代码以将 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)
}
于 2018-11-15T13:39:02.343 回答