Автоматическая миграция GORM на две базы данных / общие базы данных

#go #sharding #go-gorm

# #Вперед #сегментирование #go-gorm

Вопрос:

Я пытаюсь реализовать очень простой сегмент, используя GORM и DBResolver

Вот код для этого

 func (mysqlDB *MySQLDB) InitDB() {

    dsn_master := "root:rootroot@tcp(127.0.0.1:3306)/workspace_master?charset=utf8mb4amp;parseTime=Trueamp;loc=Local"
    dsn_shard1 := "root:rootroot@tcp(127.0.0.1:3306)/workspace_shard1?charset=utf8mb4amp;parseTime=Trueamp;loc=Local"

    db, err := gorm.Open(mysql.Open(dsn_master), amp;gorm.Config{
        Logger: logger.Default.LogMode(logger.Info)})

    if err != nil {
        log.Println("Connection Failed to Open")
    } else {
        log.Println("Connection Established")
    }

    db.Use(dbresolver.Register(dbresolver.Config{
        Sources: []gorm.Dialector{mysql.Open(dsn_shard1)}},
        amp;models.WorkspaceGroup{}, "shard1"))

    db.AutoMigrate(amp;models.Workspace{}, amp;models.WorkspaceMember{})

    //db.AutoMigrate(amp;models.Workspace{}, amp;models.WorkspaceMember{}, amp;models.WorkspaceGroup{}, amp;models.GroupMember{})

    db.Clauses(dbresolver.Use("shard1")).AutoMigrate(amp;models.WorkspaceGroup{}, amp;models.GroupMember{})

    mysqlDB.Database = db
}
 

Я создаю две базы workspace_master данных и workspace_shard1

Проблема в том, что автоматическая миграция работает не так, как ожидалось. Таблицы сегментов не создаются в соответствующей базе данных. Я также пробовал комментируемый код (автоматическая миграция со всеми таблицами и настройка db resolver ранее)

Ожидаемый результат:

Workspace и WorkspaceMember будет создан в workspace_master базе WorkspaceGroup данных и GroupMember будет создан в workspace_shard1 базе данных

Текущий результат:

Все таблицы создаются в workspace_master базе данных


Однако, если я создаю WorkspaceGroup и GroupMember вручную workspace_shard1 , Любые последующие запросы для создания, выбора, удаления и т. Д. Выполняются правильно workspace_shard1 . Итак, DBResolver, похоже, работает так, как ожидалось.

Единственная проблема db.AutoMigrate заключается в том, что она работает не так, как ожидалось. Кто-нибудь может подсказать, как этого можно достичь?

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

1. Есть ли ошибка, возвращаемая из db.AutoMigrate(...).Error ? Кроме того, возможно, стоит рассмотреть возможность открытия отдельного пула соединений для каждой базы данных.

2. @mfink ошибка не возвращается, поскольку таблицы создаются в основной базе данных. Поддержание отдельного пула соединений может усложнить код. Не могли бы вы сослаться на пример.