我正在制作一個 Golang API,以便能夠與我的 Android 應用程序中的 SQL 數據庫進行交互。我遇到的問題如下:我在https://phpmyadmin.ovh.net/ 上托管了一個 sql 數據庫我正在嘗試將我的語言環境 API 連接到這個 API。根據文檔:func Open(driverName, dataSourceName string) (*DB, error)driverName 參數將是“mysql”,不是嗎?但是,dataSourceName參數是什么?我看到很多關于 Open 的帖子,但是,我認為我不明白如何組織有關 dataSourceName 參數的 url 字符串。package mainimport ( "net/http" "database/sql" "fmt")var db *sql.DB // global variable to share it between main and the HTTP handlerfunc main() {fmt.Println("starting up")db, err := sql.Open("mysql", "????????????")if err != nil { fmt.Println("Error on initializing database connection: %s", err.Error())}err = db.Ping()if err != nil { fmt.Println("Error on opening database connection: %s", err.Error())}http.HandleFunc("/", hello)http.ListenAndServe(":8080", nil)}感謝閱讀和幫助!/!\ 編輯 /!\所以,在你的兩個答案之后,我嘗試了下面的代碼:package mainimport ("fmt""net/http""database/sql"_ "github.com/go-sql-driver/mysql")type databaseinfos struct {user stringpassword stringname stringaddress stringport stringurl string}var db *sql.DB // global variable to share it between main and the HTTP handlervar dbi *databaseinfosfunc main() {dbi := databaseinfos{ user: "Emixam23", password: "", name: "mydb", address: "127.0.0.1", port: "3306", url: ""}dbi.url = (dbi.user + ":" + dbi.password + "@tcp(" + dbi.address + ":" + dbi.port + ")/" + dbi.name)fmt.Println(dbi.url)db, err := sql.Open("mysql", dbi.url)if err != nil { fmt.Println("Error on initializing database connection: %s", err.Error())}err = db.Ping()if err != nil { fmt.Println("Error on opening database connection: %s", err.Error())}/*http.HandleFunc("/", hello)*/http.ListenAndServe(":8080", nil)}但是,我收到一個錯誤,即“打開數據庫連接時出錯:%s dial tcp 127.0.0.1:3306: connectex: 由于目標機器主動拒絕,無法建立連接?!?。問題是因為我的電腦還是因為dataSourceName參數?
2 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
dataSourceName應以 DSN 格式提供:
<username>:<password>@tcp(<host>:<port>)/<database>
例如:
db, err := sql.Open("mysql", "myuser:password@tcp(127.0.0.1:3306)/mydb")

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
你的代碼有問題,在這里:
dbi.url = (dbi.user + ":" + dbi.password + "@tcp(...
這種使用我上面看到的參數構建連接字符串的方法將導致:
Emixam23:@tcp..
.
使用空密碼,如果我們查看規范,這是錯誤的:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
我們看到,如果不需要密碼,則不得添加“:”
如果問題仍然存在并且連接字符串實際上與正確的模式匹配,請測試您是否可以訪問您的數據庫:
mysql -u Emixam23
或密碼:
mysql -u Emixam23 -p
然后嘗試訪問數據庫以查看您的用戶是否具有適當的權限:
> USE mydb; SELECT 1;
如果您甚至無法連接:
檢查您的端口和 IP 綁定是否正確:
sudo netstat -antp | grep mysql
如果沒有,請/etc/mysql/my.cnf
相應地編輯您的。
- 2 回答
- 0 關注
- 168 瀏覽
添加回答
舉報
0/150
提交
取消