2015-04-05 11 views
10

Tôi đang sử dụng trình điều khiển MySQL cho Golang cung cấp ở đâykết nối cơ sở dữ liệu lưu trữ trong một biến toàn cầu

https://github.com/go-sql-driver/mysql

Một trong những điều tôi đang cố gắng để làm là lưu trữ các biến cơ sở dữ liệu trong một kết nối toàn cầu. Theo tài liệu, sql.Open() có nghĩa vụ phải trả về một con trỏ đến một cấu trúc DB, vì vậy tôi cố gắng lưu giữ nó như

var db *DB 

Tuy nhiên, dẫn đến các lỗi

undefined: DB 

Tiếp theo điều tôi cố gắng là để nhìn vào mã nguồn của trình điều khiển MySQL, và tôi thấy một đoạn mã ở đây https://github.com/go-sql-driver/mysql/blob/master/driver.go

func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { 

vì vậy, tôi đã cố gắng để lưu các biến như driver.Conn - tuy nhiên, tôi không thể (nhập sai). Tôi cũng không thể nhập trình điều khiển.

Điều cuối cùng tôi đã cố gắng là sử dụng phản ánh mang tên của biến ánh sáng

package main 

    import (
     "fmt" 
     "reflect" 
) 

import "database/sql" 
import _ "github.com/go-sql-driver/mysql" 

func main() { 
     db, _ := sql.Open("mysql", "root:[email protected]/Tracker") 
     yt := reflect.TypeOf(db).Kind() 
     fmt.Printf("%T: %s\n", yt, yt) 
} 

Thật không may, điều đó không làm việc, hoặc - nó xuất hiện như con trỏ, và không phải là loại biến nó thực sự trỏ đến.

Tôi không biết cách tìm hiểu ngay bây giờ. Cảm ơn trước sự giúp đỡ của bạn!

Trả lời

20

Bạn cần phải hội đủ điều kiện tên của loại với tên gói:

import(
    "database/sql" 
    "github.com/go-sql-driver/mysql" 
) 

var db *sql.DB // Note the sql package provides the namespace 

func main() { 
    var err error 
    // Make sure not to shadow your global - just assign with = - don't initialise a new variable and assign with := 
    db, err = sql.Open(...) 
    if err != nil { 
     // Handle the error! 
    } 

} 

Cho dù bạn muốn có một toàn cầu (dễ dàng để bắt đầu) hoặc vượt qua nó xung quanh một cách rõ ràng là tùy thuộc vào bạn, nhưng tôi 'd đề nghị chỉ cần giữ nó đơn giản cho bây giờ. Nếu điều này xảy ra với ứng dụng web, bạn có thể chia sẻ an toàn hồ bơi kết nối *sql.DB trên trình xử lý/yêu cầu.

+5

+1 cho câu trả lời. Nên khai báo err riêng biệt hoặc biến db khác sẽ đến địa phương khác chức năng mà cố gắng sử dụng kết nối db sẽ nhận được "hoảng sợ: thời gian chạy lỗi: không hợp lệ bộ nhớ địa chỉ hoặc nil con trỏ dereference" lỗi – Ryan

Các vấn đề liên quan