我正在开发一个包含多个数据库的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:yourpassword@/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在代码中的位置应该是什么?小智 5
如果要使用这些方法保留接口,则应将接口更改为:
接口:
// The interface that all connectors should have
type Intfc interface {
    // Connect to the database, if an error occur at the moment
    // of connection, return the error
    Connect() error
    // Add returns a string, it returns an error if something occurs
    Add(string, string, string) (string, error)
    Get(string) (Object, bool)
}
MySQL的:
type Mysql struct{
    conn *sql.DB // contains the connection to the DB
}
// Connect to mysql
func (f *Mysql) Connect() error {
    conn, err := sql.Open("mysql", "yourusername:yourpassword@/yourdatabase")
    if err != nil {
        return error
    }
    f.conn = conn
    return nil
}
// Add item to DB
func (f *Mysql) Add(owner string, refType string, object string) (string, error) {
    // do something
    return // a string and error
}
func (f *Mysql) Get(Uuid string) (dbinit.Object, bool) {
    // do something
    return // an object and a bool
}
蒙戈:
type Mongo struct{
    session *mgo.Session
}
// Connect to mongo
func (f *Mongo) Connect() error {
    info := &mgo.DialInfo{
        // some data
    }
    session, err := mgo.DialWithInfo(info)
    if err != nil {
        return error
    }
    f.session = session
    return nil
}
// Add item to DB
func (f *Mongo) Add(owner string, refType string, object string) (string, error) {
    // do something
    return // a string and error (it could be nil at success)
}
func (f *Mongo) Get(Uuid string) (dbinit.Object, bool) {
    // do something
    return // an object and a bool
}
主要:
var selectedDb dbinit.Intfc
commandLineInput := "mysql"
if commandLineInput == "mysql" {
    selectedDb = &mysqlConnector.Mysql{}
} else if commandLineInput == "mongo" {
    selectedDb = &mongoConnector.Mongo{}
}
err := selectedDb.Connect()
if err != nil {
    panic(err)
}
// this runs everytime the API is called
api.HandlerFoobar = foobar.handlerFunction(func(params foobar.Params) middleware.Responder {
    data, err := selectedDb.Add(addStringA, addStringB, addStringC)
    if err != nil {
        // do something
    }
    return // the API response
})
但你也可以删除Connect() error方法Intfc,只是使用Add和Get,但你应该更新包,如:
Mysql的
// Connect to mysql, it could be any function name
func Connect() (*Mysql, error) {
    connection, err := sql.Open("mysql", "yourusername:yourpassword@/yourdatabase")
    if err != nil {
        return nil, error
    }
    return &Mysql{conn: connection}
}
蒙戈
// Connect to mongo, it could be any function name
func Connect() (*Mongo, error) {
    info := &mgo.DialInfo{
        // some data
    }
    s, err := mgo.DialWithInfo(info)
    if err != nil {
        return nil, error
    }
    return &Mongo{session: s}
}
主要
var selectedDb dbinit.Intfc
var err error
commandLineInput := "mysql"
if commandLineInput == "mysql" {
    selectedDb, err = mysqlConnector.Connect()
} else if commandLineInput == "mongo" {
    selectedDb, err = mongoConnector.Connect()
}
if err != nil {
    panic(err)
}
| 归档时间: | 
 | 
| 查看次数: | 876 次 | 
| 最近记录: |