Go中正确的数据库迁移策略

时间:2018-11-15 10:53:36

标签: sql postgresql go sqlx

我们有一个go应​​用,其中我们使用Postgres作为后端数据库。 我们使用https://github.com/jmoiron/sqlx与数据库进行通信。 读取表中所有行的代码如下:

 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,如here

所述。

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

1 个答案:

答案 0 :(得分:0)

  

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

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

其中一个选项是github.com/golang-migrate

在应用开始时运行以下代码,以将数据库架构更新为最新版本:

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)
}