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

标签 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.Unsafe,如文档中所述 here

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

最佳答案

Making change in code to update the struct simultaneously is ofcourse not possible.

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

其中一个选项是 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)
}

关于sql - Go 中数据库迁移的正确策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53317824/

相关文章:

无法从外部主机访问 Docker 部署的镜像

sql - 有什么好的 SQL Anywhere 数据库模式比较工具吗?

MySQL:选择用逗号分隔值的多条记录

node.js - 使用 pg-promise 进行附加数据的多次插入

json - 加入 jsonb 数组中对象的值

javascript - 逃逸分析

MySQL 使用 CASE .. WHEN 语法选择数据的适当方式

python - %(参数)s在这里意味着什么

sql - 按日期滚动求和的窗口函数

sql - 如何在golang中使用命令执行sql文件