Не могу понять, как использовать DBResolver ГОРМА

# #go #replication #go-gorm

Вопрос:

 import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "server/config"
    "gorm.io/plugin/dbresolver"
)
    
func DB(config *config.Config) {
    var err error

    config.DB, err = gorm.Open("mysql", config.DBDSN)
    if err != nil {
        panic(err)
    }


    if !config.IsDev {
        config.DB.Use(dbresolver.Register(dbresolver.Config{
            Replicas: []gorm.Dialector{mysql.Open("mysql", config.DBDSN2)},
        }))
    }

}
 

Я пытаюсь использовать DBresolver от GORM, чтобы использовать реплику чтения моего экземпляра облачного SQL. Я думаю, что есть некоторые проблемы с управлением версиями пакета GORM, который я использую, и плагина DBresolver. Когда я запускаю приведенный выше код, я получаю следующую ошибку:

  • config.DB.Используйте неопределенный (тип *»github.com/jinzhu/gorm».БД не имеет поля или метода использования)
  • не определено: «github.com/jinzhu/gorm».Диалект

Я не смог найти никакой причины для этого в Интернете, и существует очень мало онлайн-ресурсов, посвященных расширенным функциям GORM. Я могу легко заставить реплику работать, если создам к ней отдельное соединение, но таким образом мне нужно указывать базу данных каждый раз, когда я взаимодействую с базой данных. Я использовал следующее для реализации приведенного выше кода: https://gorm.io/docs/dbresolver.html

Ответ №1:

Вы используете путь импорта v1 для gorm, но DBResolver-это функция V2. Вы захотите вместо этого использовать:

  • "gorm.io/gorm" для основного пакета импорта
  • "gorm.io/driver/mysql" для импорта драйвера
  • gorm.Open с mysql.Open помощью для создания соединений.
  • Версия V2 в основном обратно совместима, но вам нужно будет убедиться, что любой старый код протестирован для работы в новой версии.
 import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
    "gorm.io/plugin/dbresolver"
    "server/config"
)
    
func DB(config *config.Config) {
    var err error

    config.DB, err := gorm.Open(mysql.Open(config.DBDSN), amp;gorm.Config{})
    if err != nil {
        panic(err)
    }


    if !config.IsDev {
        config.DB.Use(dbresolver.Register(dbresolver.Config{
            Replicas: []gorm.Dialector{mysql.Open("mysql", config.DBDSN2)},
        }))
    }
}
 

Комментарии:

1. Спасибо! Я заставил это работать. Вы правы насчет обратной совместимости в большинстве случаев. Мне действительно нужно изменить несколько методов, таких как, например, gorm.Scope.