Соединение с базой в Go
Соединение получают через пакет
database/sql: первым идет имя
зарегистрированного драйвера, вторым
строка с путем к файлу. Вызов открытия
сам по себе не проверяет, доступен ли
файл и жив ли движок.
Проверку делают отдельной командой связи с базой. Если она вернула ошибку, дальше запросы не шлют. Закрытие соединения ставят в отложенный вызов, чтобы файл освободился и при обычном выходе, и при раннем возврате из функции.
Откроем shop.db и проверим связь:
package main
import (
"database/sql"
"fmt"
"log"
_ "modernc.org/sqlite"
)
func main() {
db, err := sql.Open("sqlite", "shop.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("ok")
}
На экране "ok". Файл создастся,
если его еще не было; отложенное закрытие
сработает перед выходом из main.
Тот же каркас удобно копировать в каждый пример раздела: драйвер, открытие, отложенное закрытие и проверка связи перед первым запросом:
package main
import (
"database/sql"
"fmt"
"log"
"os"
_ "modernc.org/sqlite"
)
func openDB() (*sql.DB, error) {
db, err := sql.Open("sqlite", "shop.db")
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
db.Close()
return nil, err
}
return db, nil
}
func main() {
os.Remove("shop.db")
db, err := openDB()
if err != nil {
log.Fatal(err)
}
defer db.Close()
fmt.Println("ready")
}
Дан фрагмент без проверки связи после открытия. Допишите проверку и отложенное закрытие, чтобы программа не работала с мертвым соединением.
Скажите, почему после успешного открытия все равно нужна проверка связи, хотя ошибки на этом шаге не было.
Дан следующий порядок строк в main:
открытие, первый запрос, проверка связи,
отложенное закрытие. Скажите, что в
этом порядке стоит поправить.