我正在将我的应用程序连接到 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/