Opening a Database Connection
Ma'lumotlar bazasiga ulanish
sql.Open(drayver, manzil) — ulanishlar to'plamini tayyorlaydi, lekin hali haqiqiy ulanish qilmaydi. Ulanish borligini tekshirish uchun db.Ping() chaqiriladi.
example.go
package main
import (
"database/sql"
"database/sql/driver"
"fmt"
"io"
)
// ---- Tayyor infratuzilma: o'quv uchun oddiy xotiradagi SQL drayveri ----
// (Interaktiv muhitimizda internetga chiqib haqiqiy MySQL/Postgres drayverini
// o'rnatib bo'lmaydi, shuning uchun standart kutubxonaning o'zi bilan ishlaydigan
// juda soddalashtirilgan drayver yozilgan. Siz yozadigan barcha db.Exec/db.Query
// chaqiruvlari esa haqiqiy loyihada ishlatiladigan chaqiruvlarning aynan o'zi.)
type fakeDriver struct{}
func (fakeDriver) Open(name string) (driver.Conn, error) { return &fakeConn{}, nil }
type fakeConn struct{}
func (c *fakeConn) Prepare(query string) (driver.Stmt, error) { return &fakeStmt{}, nil }
func (c *fakeConn) Close() error { return nil }
func (c *fakeConn) Begin() (driver.Tx, error) { return &fakeTx{}, nil }
type fakeTx struct{}
func (t *fakeTx) Commit() error { return nil }
func (t *fakeTx) Rollback() error { return nil }
type fakeStmt struct{}
func (s *fakeStmt) Close() error { return nil }
func (s *fakeStmt) NumInput() int { return -1 }
func (s *fakeStmt) Exec(args []driver.Value) (driver.Result, error) { return fakeResult{}, nil }
func (s *fakeStmt) Query(args []driver.Value) (driver.Rows, error) { return &fakeRows{}, nil }
type fakeResult struct{}
func (r fakeResult) LastInsertId() (int64, error) { return 0, nil }
func (r fakeResult) RowsAffected() (int64, error) { return 0, nil }
type fakeRows struct{}
func (r *fakeRows) Columns() []string { return nil }
func (r *fakeRows) Close() error { return nil }
func (r *fakeRows) Next(dest []driver.Value) error { return io.EOF }
func init() { sql.Register("memdb", fakeDriver{}) }
// ---- Shu yergacha bo'lgan qism tayyor, unga tegmang ----
func main() {
db, err := sql.Open("memdb", "test")
if err != nil {
fmt.Println("ulanishda xato:", err)
return
}
defer db.Close()
if err := db.Ping(); err != nil {
fmt.Println("ping xatosi:", err)
return
}
fmt.Println("baza bilan ulanish tayyor")
}sql.Open xatoni asosan noto'g'ri drayver nomi berilganda qaytaradi (manzil formatini emas). Haqiqiy "server javob beryaptimi?" tekshiruvi — db.Ping(). defer db.Close() — dastur tugaganda ulanishlar to'plamini to'g'ri yopish uchun deyarli har doim yoziladi.
>_ Exercise
Bazaga ulaning va uni tekshiring.
- •sql.Open("memdb", "test") bilan ulaning
- •db.Ping() orqali ulanishni tekshiring
- •xato bo'lmasa "ulanish muvaffaqiyatli" chop eting
Stuck? Reveal a hint to help you.
Hints (0/3)
Key Takeaway
Key Takeaway:
sql.Open ulanishlar to'plamini tayyorlaydi (hali haqiqiy ulanmaydi), db.Ping() esa ulanish ishlashini tekshiradi.
NEXT UP
Executing Statements with Exec
OUTPUT
$ go run main.go
Kodingizni ishga tushiring