我对golang中更好的代码使用有疑问。
在少数软件包中使用像数据库这样的实时连接的最佳情况是什么。
最好添加像
这样的数据库连接1
func (database DB) getRows(){
}
或 2。
func getRows(database *DB){
}
或 3。
func getRows(){
init database connection...
}
对于1种用法,我们需要为DB
创建本地结构type DB struct{
connection
}
在不同的包中我需要移动数据库连接,在每个包中创建本地结构,或者当某个包没有使用数据库连接而导入包使用时?如何发送一个配置并只创建一个连接?单身人士是个好主意?
您是否对此案例使用有任何提示和技巧?
答案 0 :(得分:0)
一个好的做法是在应用程序启动时创建的连接周围传递持久数据库。此连接将满足您在函数中进行的后续数据库调用的接口。您使用接口的原因是允许交换底层数据库以及在应用程序内进行测试的灵活性。
对于此示例,我使用jmoiron/sqlx包。
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron"
)
func main() {
// Connect to the DB to create the persistent connection.
db := connDB()
// The sqlx.DB connection returned will satisfy the DB interface.
name, err := getRows(db)
}
// DB is required for functions interfacing with the database.
type DB interface {
Get(dest interface{}, q string, args ...interface{}) error
Select(dest interface{}, q string, args ...interface{}) error
Exec(q string, args ...interface{}) (sql.Result, error)
}
// connDB connects to the database and returns an active connection.
func connDB() *sqlx.DB {
// Connect to the database and ping, confirming connection was made.
// Panic if the connection was not successful.
db, err := sqlx.Connect("mysql", "root:password@tcp(localhost)/default")
if err != nil {
panic(err)
}
db.SetMaxIdleConns(10)
db.SetMaxOpenConns(60)
return db
}
// getRow will now be able to make DB calls.
func getRow(database DB) (string, error) {
var name string
q := `SELECT name FROM user WHERE id=?;`
if err := database.Get(&name, q, "user123"); err != nil {
return name, err
}
return name, nil
}