在使用DSN连接到具有以下结构的Planetscale数据库之后:
user:password@tcp(host)/database?tls=true我决定通过运行一个简单的查询来测试它。这是我的main.go文件:
package main
import (
"database/sql"
"fmt"
"os"
_ "github.com/go-sql-driver/mysql"
)
func GetDatabase() (*sql.DB, error) {
db, err := sql.Open("mysql", os.Getenv("DSN"))
return db, err
}
func main() {
db, err := GetDatabase()
if err != nil {
panic(err)
}
if err := db.Ping(); err != nil {
panic(err)
}
// ---
query, err := db.Query("SELECT name FROM status;")
if err != nil {
panic(err.Error())
}
var name string
for query.Next() {
err = query.Scan(&name)
if err != nil {
panic(err.Error())
}
fmt.Println(name)
}
// ---
fmt.Println("Successfully connected to PlanetScale!")
}如果删除两个注释行之间的部分,它将打印出“成功连接”消息;但是,如果我尝试运行它(包括查询部分),则结果将更改为: panic: Error 1046: No database所选。
好吧,我决定尝试一下这个查询:
"USE database; SELECT name FROM status;"但是,默认驱动程序不会接受多个语句并返回语法错误。
我知道这似乎是一个简单的问题,但我已经阅读了来自planetscale、go mysql驱动程序的文档,而且我还无法克服这个小问题。任何帮助都将不胜感激。
发布于 2022-05-12 09:50:03
看起来问题在于.env文件。如果我将相同的信息保存到同一个GetDatabase()函数中的字符串变量中,然后将其作为参数而不是os.Getenv()传递,它将正常连接。不知道为什么会这样,但是如果有人能提供更多的信息,我会很感激的。
编辑:
当将我的凭据保存到一个.env文件并使用内置函数os.Getenv(" DSN ")时,程序确实会连接到planetscale,但是它不会在DSN字符串中选择给定的数据库。正如问题中提到的,首先选择数据库,然后运行语句/查询,由于驱动程序的限制,无法工作。
如果我将变量硬编码为字符串变量,例如:
dsn := "root:mlc@tcp(127.0.0.1:3306)/app"然后使用它来打开连接,这一次程序将使用所需的数据库来解决任何问题。
https://stackoverflow.com/questions/72210603
复制相似问题