Новинка отсюда. Приходите из .Net-земли, так что несите меня ... Хотелось бы получить некоторое руководство по архитектуре моего приложения Go специально в отношении управления и повторного использования соединений с БД.GoLang: Losing scope в базе данных
Я разделил свой код db на пакет, чтобы позволить db-lookups в пакете обрабатывать SQL-запросы, подобные слою репозитория. Я хочу иметь гибкость, чтобы отделить мой уровень db от моих сервисов приложений, поэтому я могу легко заменить мою базу данных, если это необходимо.
В основном я ищу несколько советов о том, как и когда обрабатывать sql connect и удерживать указатель sql.DB в приложении. Нужно ли удерживать глобальный указатель в main.go или я могу управлять соединением в моем пакете mysql?
Вот мой код:
package mysqlstorage
import (
"database/sql"
"fmt"
"log"
"types"
)
var db *sql.DB
func Connect() {
db, dberr := sql.Open(“<CONNECTION_STRING>“)
if dberr != nil {
fmt.Println(dberr)
}
}
func SaveUser(u types.User) {
// use db here!
....
}
func GetUser(id string) types.User {
// use db here!
....
}
На мой main.go работает и с помощью моего пакета userservices, чтобы попытаться сохранить пользователя, я попал в проблему, когда я появляюсь потерять сферу моего указателя: -
2015/05/03 17:49:08 http: panic serving [::1]:50106: runtime error: invalid memory address or nil pointer dereference goroutine 7 [running]: net/http.func·011()
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1130 +0xbb database/sql.(*DB).conn(0x0, 0x10, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:634 +0x7ae database/sql.(*DB).Ping(0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:462 +0x3a mysqlstorage.SaveUser(0x0, 0xc20805425a, 0x7, 0xc208054280, 0x11, 0xc208054268, 0x6, 0xc208054274, 0x5)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/mysqlstorage/mysqlstorage.go:24
+0x35 services.CreateUser(0x57c148, 0xc2080563c0, 0xc2080329c0)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/services/userservices.go:30
+0x398 net/http.HandlerFunc.ServeHTTP(0x3d02a0, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1265 +0x41 github.com/gorilla/mux.(*Router).ServeHTTP(0xc20803c140, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/github.com/gorilla/mux/mux.go:98
+0x297 net/http.(*ServeMux).ServeHTTP(0xc20803a720, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1541 +0x17d net/http.serverHandler.ServeHTTP(0xc2080543c0, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1703 +0x19a net/http.(*conn).serve(0xc208056320)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1204 +0xb57 created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1751 +0x35e
Любое руководство будет оценено! Спасибо, парни!
'db, dberr = ...' и сделать 'dberr' глобальной переменной? – semicircle21
См. Соответствующую [Определение глобальной переменной и короткой переменной] (https://stackoverflow.com/questions/28284138/go-global-variable-and-short-variable-definition) –
Спасибо, ребята, yup .. обрабатывая переменные глобально это то, к чему я должен привыкнуть, чтобы избежать многих лет! Благодаря! – freya19