Golang编译失败:import "example.com/mysql"是程序而非可导入包

Golang编译失败:import "example.com/mysql"是程序而非可导入包 我正在通过GCP控制台连接数据库,使用Go语言创建新函数,并采用了已有数据库的示例代码。但出现错误:“构建失败:导入‘example.com/module’是一个程序,而非可导入的包”。如果移除example.com,则会显示错误“斜杠前的第一个路径元素必须包含点”。

package main

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

func main() {
    fmt.Println("Go MySQL Tutorial")

    // 打开数据库连接。
 
    // 数据库名为 testDb
    db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/test")

    // 如果连接打开出错,处理错误
    if err != nil {
        panic(err.Error())
    }

    // 延迟关闭连接,直到主函数执行完毕
    defer db.Close()

}

以及go.mod文件:

module example.com/mysql  
go 1.20
require github.com/go-sql-driver/mysql v1.7.1

我希望通过代码连接数据库。


更多关于Golang编译失败:import "example.com/mysql"是程序而非可导入包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

好的……谢谢……我会检查一下

更多关于Golang编译失败:import "example.com/mysql"是程序而非可导入包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


所以,在代码中需要同时添加HTTP处理函数和数据库部分吗?模块名称会是什么?除了通过Go语言的云函数,还有其他方法来检查数据库连接吗?

我仍然看不出你的配置与这些错误信息之间有什么联系。我怀疑这是一个GCP特有的问题。

你是否使用了某些特定的GCP服务?看起来该服务期望接收一个库包,而不是一个主包,以便它能将其导入到它的框架中。

我对云函数了解不多。但基本上,代码函数、AWS Lambda 函数以及其他函数即服务系统都基于相同的原理:通过 HTTP 请求触发函数。

我猜想检查数据库连接的最快方法是快速设置一个 HTTP 处理器(只需几行代码)来触发该函数。

你好 @Aurelia,欢迎来到论坛。

我不完全理解这个问题的背景。

  1. 触发错误的导入指令

    import "example.com/module"
    

    在哪里?

  2. 消息“必须在斜杠前的第一个路径元素中包含点”表明需要一个URL。Go编译器不将导入路径视为URL。这条消息来自哪里?

好的,你正在使用云函数。这就是你遇到以下错误的原因:

“构建失败:导入的 example.com/module 是一个程序,而不是一个可导入的包。”

Google 云函数期望一个包含 HTTP 处理函数、且非 main 的包。

而你的代码代表的是一个独立的可执行文件,无法作为云函数运行。

我建议先修复这部分问题(也就是将应用转换为云函数),然后再处理问题中与数据库相关的部分。

你好 @christophberger 感谢你的回复

  1. example.com/module” 是我在 go.mod 文件中的模块名。对于模块名,它显示错误。并且在 main.go 文件中包含以下包 import ( “fmt” “database/sql” _ “githubcom/go-sql-driver/mysql” )

  2. 在 go.mod 文件中,模块名期望是代码所在位置的路径。这条消息显示在 GCP 控制台中。我也尝试过通过 GitHub 工作流推送代码,并将模块名设置为 GitHub 仓库链接,例如 github.com/myproject/projectname。但它仍然显示相同的错误。

根据你的错误信息和代码,问题出在 go.mod 文件的模块声明上。错误提示“import ‘example.com/mysql’ 是一个程序,而非可导入的包”表明 Go 工具链将你的模块路径解释为了一个可执行程序,而不是库包。这通常是因为模块路径不符合 Go 的模块命名规范。

在你的 go.mod 文件中,模块路径 example.com/mysql 缺少有效的域名后缀(如 .com.org 等),且 mysql 部分可能与标准库或常见包名冲突。Go 要求模块路径的第一个路径元素(斜杠前)必须包含点(如 example.com),否则会报错“斜杠前的第一个路径元素必须包含点”。

以下是解决方案:

  1. 修改 go.mod 文件:将模块路径改为一个有效的、符合规范的路径。例如,使用你的 GitHub 仓库路径或一个自定义域名。这里假设你使用 github.com/yourusername/mysqlapp 作为示例(请替换为你的实际路径)。

    module github.com/yourusername/mysqlapp
    
    go 1.20
    
    require github.com/go-sql-driver/mysql v1.7.1
    
  2. 更新导入路径(如果需要):如果你的代码中导入了本地包(当前代码中没有,但未来可能需要),确保导入路径与 go.mod 中的模块路径一致。例如,如果创建子包 utils,则导入应为 github.com/yourusername/mysqlapp/utils

  3. 清理并重新构建:在修改 go.mod 后,运行以下命令来同步依赖并清理缓存:

    go mod tidy
    go clean -modcache
    
  4. 验证数据库连接代码:你的 Go 代码本身是正确的,但需要确保数据库连接字符串与实际 GCP 数据库配置匹配。以下是更新后的完整示例代码,连接字符串已调整为典型格式:

    package main
    
    import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
        fmt.Println("Go MySQL Tutorial")
    
        // 更新连接字符串以匹配 GCP 数据库配置
        // 格式: "用户名:密码@tcp(主机名:端口)/数据库名?参数"
        // 例如 GCP Cloud SQL: "user:password@tcp(127.0.0.1:3306)/testDb?parseTime=true"
        db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/testDb")
        if err != nil {
            panic(err.Error())
        }
        defer db.Close()
    
        // 测试连接
        err = db.Ping()
        if err != nil {
            panic(err.Error())
        }
        fmt.Println("Database connected successfully")
    }
    
  5. 运行程序:执行以下命令来构建和运行:

    go run main.go
    

如果问题仍然存在,请检查你的 Go 版本(go version)并确保它至少为 1.20。此外,确认 GCP 环境中的网络设置允许连接到数据库(例如,正确配置了 IP 白名单或使用 Cloud SQL 代理)。

回到顶部