Yi Jiang
Yi Jiang

Reputation: 4028

Wrapped sql.DB by struct can't invoke methods in instance

My goal is using a struct to wrap sql.DB to do something more than sql.DB. The instance I create can't work and give me this error when I run it.

DbConn.db.prepare undefined (cannot refer to unexported field or method sql.(*DB)."".prepare)

My code is:

type DatabaseConn struct {
  driverName string
  databaseName string
  userName string
  password string
  dataSourceName string
  db *sql.DB
}

func (d DatabaseConn)Open() error {
    d.driverName    = DB_DRNAME
    d.userName      = DB_UNAME
    d.password      = DB_PWD
    d.databaseName  = DB_DBNAME
    d.dataSourceName = fmt.Sprintf("%s:%s@/%s?charset=utf8",d.userName, d.password, d.databaseName)
    db, err := sql.Open(d.driverName, d.dataSourceName)
    return err
}


func (d *DatabaseConn)Close() error {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Trying to handle error in DatabaseConn.Close(): ", err)
        }
    }()

    err := d.db.Close()
    return err
}

I am trying to create an instance and invoke sql.DB method.

var dbConn DatabaseConn
dbConn.Open()
defer dbConn.Close()
dbQuery := fmt.Sprintf("SELECT *, FROM ms_node WHERE node_id = ?")
getNodeRecord, err := dbConn.db.prepare(dbQuery)

The error message is pointed here.

./server.go:343: dbConn.db.prepare undefined (cannot refer to unexported field or method sql.(*DB)."".prepare)

(Personal background: I am newbie for 2 weeks)

Upvotes: 0

Views: 60

Answers (1)

cd1
cd1

Reputation: 16534

The function Prepare starts with a capital letter ;)

So you should have:

getNodeRecord, err := dbConn.db.Prepare(dbQuery)

Upvotes: 1

Related Questions