我是 golang 和 MySQL 的新手,我正在使用开发框创建一个简单的网页,使用 golang(来自 2 个文件的代码在下面)来获取输入,将输入存储到数据库中并在网页上显示输入。目前在本地使用 MySQL 作为我的数据库,我的用户名是 root,密码是 abc,我的数据库也被命名为 abc。在顶部我已经导入: import ( _"github.com/go-sql-driver/mysql" "database/sql" )当我提供我的网页时,我调用我的 connectDB 函数: func init(){ INDEX_HTML , _ = ioutil.ReadFile("./templates/index.html") connectDb() } func connectDb(){ //socket : var/run/mysqld/mysqld.sock /* connection string examples : db, err := sql.Open("mysql", "user:password@/dbname") user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true TCP using default port (3306) on localhost: user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped Use the default protocol (tcp) and host (localhost:3306): user:password@/dbname No Database preselected: user:password@/*/ db, err := sql.Open("mysql", "root:abc@/abc") log.Println("DB: ", db) checkErr(err) // Open doesn't open a connection. Validate DSN data: checkErr(err) }我的理解和根据https://github.com/go-sql-driver/mysql SQL.open 返回一个 * sql.DB,并且当程序遇到上面的以下代码时:/* At the top of my code i have var db = *sql.DB */log.Println("DB: ", db)我在命令提示符中得到以下内容,上面的代码注释中记录了所有类型的示例连接字符串:DB: &{0x99c410 root:abc@/abc 0 {0 0} [] [] 0 0xc820072180 false map[] map[] 0 0 0 < nil >}我的 MySQL 数据库使用给定的用户名和密码通过命令行在本地运行良好,我可以通过手动插入以下查询获得一些项目。mysql>mysql> select * from ListItems -> ;+-------+| items |+-------+| item1 || item2 |+-------+我试图了解消息是什么以及如何连接到 mysql 数据库以运行查询并插入数据库。也许我的连接字符串有问题?尝试插入数据库时的错误示例:016/06/20 02:22:36 http: panic serving 10.1.0.5:41861: runtime error: invalid memory address or nil pointer dereferencegoroutine 7 [running]:
1 回答
跃然一笑
TA贡献1826条经验 获得超6个赞
db问题是您声明的全局变量var db *sql.DB从未被赋值。所以它保持它的默认值,即nil. 并且试图取消引用一个 nil 指针会给你错误。
您可能认为在init函数中为该变量分配了新创建的DB实例。但是:=会创建一个新的局部变量来保存新DB实例。全局db变量保持不变。见例子。
所以改为这样做,
var err error
db, err = sql.Open("mysql", "root:abc@/abc")
同样根据我使用全局变量的经验,当您可以避免它导致难以调试的错误时。(就像这个。)我认为你可以通过connectDb返回一个DB实例来避免它。
- 1 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消