Я работаю над API-интерфейсом Go RESTful API с несколькими базами данных. При запуске сервера пользователь поставляет ту базу данных, которую они хотели бы использовать.
В приложении у меня есть три функции, из которых обрабатывается соединение: selectedDb.Get()
, selectedDb.Add()
, selectedDb.Connect()
.
Если кто-то выбирает, Mysql, он обрабатывает вещи для Mysql, если кто-то выбирает MongoDB, он обрабатывает вещи для Mongo и т.д.
Вот как я пытаюсь это сделать:
DbInterface.go
package dbinit
type Object struct {
Uuid string
Object string
Deleted bool
}
// The interface that all connectors should have
type Intfc interface {
Connect() HERE_LIES_MY_PROBLEM
Add(string, string, string) string
Get(string) (Object, bool)
}
MySQL.go
package mysqlConnector
import (
...
)
type Mysql struct{}
// Connect to mysql
func (f Mysql) Connect() HERE_LIES_MY_PROBLEM {
client, err = sql.Open("mysql", "yourusername:[email protected]/yourdatabase")
if err != nil {
panic(err.Error())
}
return client
}
// Add item to DB
func (f Mysql) Add(owner string, refType string, object string) string {
// do stuff related to this DB
return // a string
}
func (f Mysql) Get(Uuid string) (dbinit.Object, bool) {
// do stuff related to this DB
return // an object and a bool
}
Mongo.go
package mongoConnector
import (
...
)
type Mongo struct{}
// Connect to mongo
func (f Mongo) Connect() HERE_LIES_MY_PROBLEM {
info := &mgo.DialInfo{
Addrs: []string{hosts},
Timeout: 60 * time.Second,
Database: database,
Username: username,
Password: password,
}
client, err := mgo.DialWithInfo(info)
if err != nil {
panic(err)
}
return client
}
// Add item to DB
func (f Mongo) Add(owner string, refType string, object string) string {
// do stuff related to this DB
return // a string
}
func (f Mongo) Get(Uuid string) (dbinit.Object, bool) {
// do stuff related to this DB
return // an object and a bool
}
main.go
...
var selectedDb dbinit.Intfc
commandLineInput := "mysql" // just for the example
if commandLineInput == "mysql" {
selectedDb = mysqlConnector.Mysql{}
} else if commandLineInput == "mongo" {
selectedDb = mongoConnector.Mongo{}
}
client := selectedDb.Connect()
// this runs everytime the API is called
api.HandlerFoobar = foobar.handlerFunction(func(params foobar.Params) middleware.Responder {
// Here I want to add something to the selected dbinit
selectedDb.Get(client, addStringA, addStringB, addStringC)
return // the API response
})
...
Описание проблемы
Когда я возвращаю клиента для Mysql, он не работает для Mongo и наоборот.
Я хочу подключиться к базе данных ТОЛЬКО при запуске сервера и сохранить client
внутри клиентской переменной. Проблема, однако, в том, что Mongo возвращает другого клиента, чем Mysql, и т.д.
- Что должно быть в тех местах, где у меня есть
HERE_LIES_MY_PROBLEM
в коде? - Или я не ошибаюсь в парадигме Go, чтобы справиться с этими вещами?