2016-03-16 2 views
0

Моя цель - использовать struct для wrap sql.DB, чтобы сделать что-то большее, чем sql.DB. Созданный экземпляр не может работать и давать мне эту ошибку при запуске.Обернутый sql.DB от struct не может вызывать методы в примере

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

Мой код:

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:%[email protected]/%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 
} 

Я пытаюсь создать экземпляр и вызвать метод sql.DB.

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

Здесь указано сообщение об ошибке.

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

(Личный опыт: Я новичок в течение 2 недель)

+0

Есть все этот код внутри одного пакета? Вы также должны удалить свое использование 'defer' - это не поможет сделать ваш код более четким или безопасным. – elithrar

+0

@elithrar Да. Я предполагаю, что они находятся в одном пакете, так как они находятся в одном файле .go. Я думаю, что что-то не так с указателем и экземпляром. Но я не могу сказать, что проблема есть. Извините, я не очистил отсрочку. Я делаю это прямо сейчас. –

+0

Я думаю, вы хотите sql.Open назначить d.db, а не только db. Также возможна синтаксическая ошибка sql: *, – Mark

ответ

1

Функция Prepare начинается с заглавной буквы;)

Таким образом, вы должны иметь:

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

Я потратил часы, чтобы найти эту ошибку! СПАСИБО! –

Смежные вопросы