2015-10-03 18 views
0

Я новичок в 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?

+0

Какая ошибка вы получаете? – elithrar

+1

Далее: ваш метод 'dbType.DbConnect()' возвращает «DatabaseType» с инициализированным соединением, но вы полностью игнорируете возвращаемое значение. – elithrar

+0

@elithrar - вы правы. Типичная ошибка начала – CroiOS

ответ

1

Ваш метод dbType.DbConnect() возвращает DatabaseType с инициализированным соединением, но вы полностью игнорируете возвращаемое значение.

Дальше - упростить код - посмотреть на имеющие New(host string) *DB вместо три различных функций (New/БДСВЯЗЬ/GetDb), которые делают то же самое.

например.

package datastore 

type DB struct { 
    // Directly embed this 
    *sql.DB 
} 

func NewDB(host string) (*DB, error) { 
    db, err := sql.Open(...) 
    if err != nil { 
     return nil, err 
    } 

    return &DB{db}, nil 
} 

package main 

var db *datastore.DB 

func main() { 
    var err error 
    db, err = datastore.NewDB(host) 
    if err != nil { 
     log.Fatal(err) 
    } 

    err := someFunc() 
} 

func someFunc() error { 
    rows, err := db.Exec("DELETE FROM ...") 
    // Handle the error, parse the result, etc. 
} 

Это уменьшает жонглирование вы должны сделать, и вы все еще можете назвать близко от типа БД, поскольку он встраивает *sql.DB - нет необходимости реализовать свой собственный Close() метод.

+0

благодарит вас за объяснение, это действительно помогает мне – CroiOS