GoDasturchi
Opening a Database Connection

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

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