mysql - 在 Go 中创建 MySql 接口(interface)的正确方法

标签 mysql go interface

我正在将我的应用程序连接到 MySql。代码的结构如下,虽然可行,但对我来说有点奇怪。这是正确的模式吗?

我已将与 Db 相关的内容保存在一个单独的文件中,如下所示:

var DatabaseObject MySqlDatabase

type IMySqlDatabase interface {
    ConnectToDb() MySqlDatabase
    GetDb() MySqlDatabase
}

type MySqlDatabase struct{
    Db *sql.DB
}

func (MySqlDatabase) ConnectToDb(connectionString string){
    db, _ := sql.Open("mysql", connectionString)

    _ = db.Ping()

    DatabaseObject = MySqlDatabase{Db: db}
}

    func (MySqlDatabase) GetDb() *sql.DB{
    return DatabaseObject.Db
}

因此,我可以通过以下方式连接到数据库:
infrastructureMySql.DatabaseObject.ConnectToDb(connectionString)

我觉得很奇怪。首先有没有界面的感觉?如果我没有它,我可以简单地使用 *sql.DB 作为全局变量。感谢您的反馈意见。

最佳答案

在创建数据库时,我通常喜欢遵循 ​​Ben Johnson 的本指南:
See 3. Wrap types for application-specific context

这篇文章提到我们可以通过与接口(interface)交互在这里提供一个抽象层,所以你不需要在应用层泄露这些细节。
您提到您想要执行查询和其他命令,以便您可以针对这些命令绘制一个界面,如下所示:

type Mysql struct {
    db *sql.DB
}

// Wrap a new connection into the MySql struct
func NewMysql() (*Mysql, error) {
    db, err := sql.Open(...)
    return &Mysql{ db }, err
}

func (m *Mysql) GetUsers(...) ([]User, error) {}
func (m *Mysql) CreateUsers(...) (User, error) {}

type UserStore interface {
   GetUsers func(...) []User, error)
   CreateUsers func(...) (User, error)
}

关于mysql - 在 Go 中创建 MySql 接口(interface)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61368797/

相关文章:

sql - mysql查询: it's not fetching first result

mysql - 我如何在 VueJS 中遍历 JSON?

php - mysql,从多个表中选择数据,表中没有公共(public)字段

generics - 具有混合成员类型的通用 TypeScript 接口(interface)

java - 为什么接口(interface)不支持静态方法?

java - 为什么要声明一个接口(interface),然后在 Java 中用它实例化一个对象?

mysql - 如何将小时数转换为天数 - MYSQL

json - 使用接口(interface)将 JSON 字符串解码为数组

go - 如何检查函数参数和类型

go - http.ServeFile 获取不到静态源,但是命令运行可以获取