2016-10-31 3 views
0

У меня возник вопрос о более эффективном использовании кода в golang.Головные соединения GoLang в функции

Каков наилучший вариант использования прямого подключения, например, базы данных в нескольких пакетах.

Лучше добавить подключение к базе данных, как

1.

func (database DB) getRows(){ 

} 

или 2.

func getRows(database *DB){ 

} 

или 3.

func getRows(){ 
    init database connection... 
} 

Для 1 использования нам нужно создать локальную БД-структуру для

type DB struct{ 
connection 
} 

в другом пакете, мне нужно переместить DB соединение с созданием местной структуры в каждом пакете или когда некоторый пакет не использовать соединение с базой данных, но импортирован пакет использовать? Как отправить одну конфигурацию и создать только одно соединение? Синглтон - хорошая идея?

Есть ли у вас какие-либо советы и рекомендации для использования этого случая?

+0

см. Также http://stackoverflow.com/questions/40333799/abstracting-away-the-persistence-layer-in-go. Короткий ответ на что-то вроде 2, поэтому вы можете перейти в Tx, а не в БД, но см. Предыдущую ссылку. также рекомендуем http://go-database-sql.org/index.html –

ответ

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:[email protected](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 
}