Я новичок в golang. Я пытаюсь поделиться соединением базы данных mysql в своем пакете, возможно, в нескольких пакетах. Чтобы пропустить определение соединения с базой данных в каждом пакете, я создал пакет базы данных, и теперь я пытаюсь получить этот пакет, подключиться к db и использовать этот объект в целом пакете.Совместное использование базы данных с пакетами
Я использую этот плагин MySQL: github.com/go-sql-driver/mysql
вот мой код:
main.go
package main
import (
"log"
"./packages/db" // this is my custom database package
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var dbType Database.DatabaseType
var db *sql.DB
func main() {
log.Printf("-- entering main...")
dbType := Database.New()
db = dbType.GetDb()
dbType.DbConnect()
delete_test_data()
dbType.DbClose()
}
func delete_test_data(){
log.Printf("-- entering delete_test_data...")
//db.Exec("DELETE FROM test;")
}
пакеты/дб/db.go
package Database
import (
"log"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type DatabaseType struct {
DatabaseObject *sql.DB
}
func New()(d *DatabaseType) {
d = new(DatabaseType)
//db.DatabaseObject = db.DbConnect()
return d
}
func (d *DatabaseType) DbConnect() *DatabaseType{
log.Printf("-- entering DbConnect...")
var err error
if d.DatabaseObject == nil {
log.Printf("--------- > Database IS NIL...")
d.DatabaseObject, err = sql.Open("mysql", "...")
if err != nil {
panic(err.Error())
}
err = d.DatabaseObject.Ping()
if err != nil {
panic(err.Error())
}
}
return d
}
func (d *DatabaseType) DbClose(){
log.Printf("-- entering DbClose...")
defer d.DatabaseObject.Close()
}
func (d *DatabaseType) GetDb() *sql.DB{
return d.DatabaseObject
}
Все нормально и без ошибок, пока я не раскомментировать эту строку:
db.Exec("DELETE FROM test;")
Может ли кто-нибудь сказать мне, что является правильным способом совместного использования соединения db?
Какая ошибка вы получаете? – elithrar
Далее: ваш метод 'dbType.DbConnect()' возвращает «DatabaseType» с инициализированным соединением, но вы полностью игнорируете возвращаемое значение. – elithrar
@elithrar - вы правы. Типичная ошибка начала – CroiOS