#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 ошибка не возвращается, поскольку таблицы создаются в основной базе данных. Поддержание отдельного пула соединений может усложнить код. Не могли бы вы сослаться на пример.