Правильная стратегия миграции БД в Go - PullRequest
0 голосов
/ 15 ноября 2018

У нас есть приложение 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, как описано здесь

Есть ли другой идиоматический способ справиться с этой ситуацией?

1 Ответ

0 голосов
/ 15 ноября 2018

Внесение изменений в код для одновременного обновления структуры не представляется возможным.

Вы можете управлять схемами БД внутри вашей кодовой базы и иметь некоторый код запуска приложения, который автоматически переносит БД в последнюю схемуверсия для синхронизации кода и БД.

Один из вариантов: 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)
}
...