#go
#Вперед
Вопрос:
Я пытаюсь сгруппировать код моей базы данных в подпакет, который как бы инкапсулировал мое подключение к базе данных и все мои подготовленные инструкции.
Я могу создать подключение к базе данных и инструкции в init
функции пакета, но в какой-то момент мне нужно их закрыть.
В программе, где эти переменные инициализированы в коде, который их использует, я бы использовал defer db.Close()
и т.д., Но как это сделать здесь?
Я бы предпочел не предоставлять глобальные переменные пакета (connection и statements), чтобы вызывающий мог получить к ним доступ для их закрытия. Есть ли способ сделать это более элегантным способом?
Я подозреваю, что у меня может быть неправильная парадигма в виду, и я пытаюсь создавать объекты (по сути, это то, что здесь) на языке, в котором их нет. Если это так, то я был бы признателен за любую помощь в том, как это сделать по-быстрому.
package database
import (
"database/sql"
_ "github.com/lib/pq"
)
var db *sql.DB
var stmtSelectUser *sql.Stmt
func GetUser(email string) string {
var name string
stmtSelectUser.QueryRow(email).Scan(amp;name)
return name
}
func init() {
var e error;
db, e = sql.Open("postgres", "host=localhost dbname=pictocat sslmode=disable")
stmtSelectUser, e = db.Prepare("select * from users where email='$1'")
}
Ответ №1:
Из вашего примера кода не совсем ясно, в чем ваша проблема, но в целом:
Либо функция, выполняющая инструкцию, должна завершить инструкцию и закрыть () ее, либо вам нужно добавить функцию в ваш пакет, чтобы вызывающий объект мог ее закрыть; все очень просто.
Вам не нужно предоставлять доступ ко всему содержимому базы данных в вашем пакете, достаточно функции, которая, в свою очередь, вызывает Close() .