如何处理未知变量或如何处理多个数据库

编程入门 行业动态 更新时间:2024-10-23 07:34:18
本文介绍了如何处理未知变量或如何处理多个数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在使用具有多个数据库的Go RESTful API应用程序.启动服务器时,用户将提供他们要使用的数据库.

I'm working on a Go RESTful API application with multiple databases. When starting the server, the user supplies which database they would like to use.

在应用程序中,我具有三个功能,其中一个功能处理连接: selectedDb.Get(), selectedDb.Add(), selectedDb.Connect().

In the application, I have three functions of which one handles the connection: selectedDb.Get(), selectedDb.Add(), selectedDb.Connect().

如果有人选择Mysql,它将处理Mysql的事情,如果有人选择MongoDB,则它将处理Mongo的事情,等等.

If somebody selects, Mysql, it handles things for Mysql, if someone selects MongoDB it handles things for Mongo and so on.

这是我尝试来完成此任务的方式:

This is how I try to accomplish this:

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,反之亦然.

When I return the client for Mysql, it doesn't work for Mongo and visa versa.

我只想在启动服务器时连接到数据库,并将 client 存储在client变量中.但是,问题在于Mongo返回的客户端不同于Mysql的客户端,依此类推.

I want to connect to the database ONLY when starting the server and store the client inside the client variable. The problem, however, is that Mongo returns another client than Mysql does and so forth.

  • 代码中有 HERE_LIES_MY_PROBLEM 的地方应该是什么?
  • 还是因为处理这些事情而使Go范式错误?
  • 推荐答案

    如果要使用这些方法保留接口,则应将接口更改为:

    If you want to preserve the interface with those methods, you should change a little your interface as:

    接口:

    // 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 })

    但是您也可以从 Intfc 中删除 Connect()错误方法,而只需使用 Add 和 Get ,但您应该更新以下软件包:

    But you also can remove the Connect() error method from Intfc and just use Add and Get, but you should update the packages like:

    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) }

    更多推荐

    如何处理未知变量或如何处理多个数据库

    本文发布于:2023-10-30 04:10:23,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1541722.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:如何处理   多个   变量   数据库

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!