mysql - 将数据库连接功能与查询功能分开
问题描述
我一直在尝试使用http://www.github.com/go-sql-driver/mysql执行查询并一直在关注本教程:https ://tutorialedge.net/golang/golang-mysql-tutorial/
现在本教程在 1 个自定义函数中完成了所有工作,但我尝试将打开数据库连接和查询本身拆分为单独的函数。我这样做的方式是这样的:
package main
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type SqlResult struct {
id int
}
var db *sql.DB
func main() {
dbConnection:= openDatabaseConnection();
getID(dbConnection);
}
func openDatabaseConnection() *sql.DB {
db,err:= sql.Open("mysql","username:password@tcp(127.0.0.1:3306)/test");
if err != nil {
panic(err.Error())
}
defer db.Close()
return db
}
func getID(db *sql.Db) {
results,err:= db.Query("SELECT id FROM test")
for results.Next() {
var result SqlResult
err=results.Scan(&result.id)
if err != nil {
panic(err.Error())
}
fmt.Print(result.id)
}
}
这不会打印出任何东西,但也不会给出错误。
现在,当我将代码放入 1 个函数时,如下所示:
package main
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type SqlResult struct {
id int
}
var db *sql.DB
func main() {
openDatabaseConnection();
}
func openDatabaseConnection() *sql.DB {
db,err:= sql.Open("mysql","username:password@tcp(127.0.0.1:3306)/test");
if err != nil {
panic(err.Error())
}
results,err:= db.Query("SELECT id FROM test")
for results.Next() {
var result SqlResult
err=results.Scan(&result.id)
if err != nil {
panic(err.Error())
}
fmt.Print(result.id)
}
defer db.Close()
return db
}
这会返回我所有的 id,但我想拆分功能。似乎每次我需要新查询时都打开数据库连接是正确的解决方案。
有谁知道我在第一个例子中做错了什么,如果是这样,我想要的正确方式是什么?
解决方案
“我想要的正确方式是什么?”
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func main() {
db = openDatabaseConnection()
defer db.Close()
printIds(db)
}
func openDatabaseConnection() *sql.DB {
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/test")
if err != nil {
panic(err)
} else if err := db.Ping(); err != nil {
panic(err)
}
return db
}
func printIds(db *sql.DB) {
rows, err := db.Query("SELECT id FROM test")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
if err := rows.Scan(&id); err != nil {
panic(err)
}
fmt.Println(id)
}
if err := rows.Err(); err != nil {
panic(err)
}
}
推荐阅读
- django - 应用程序链接到根目录而不是重定向时的实际应用程序
- python - KerasTuner 自定义目标函数
- powerbi - DAX:如何对不相关表中两个日期之间的值求和?
- node.js - 无法解析节点模块中的依赖关系
- ruby-on-rails - Rails - 通过在 has_many 上使用连接模型进行过滤
- java - Spring Data MongoDB 中的 INNER JOIN 集合
- javascript - 每次使用 JS 单击不同按钮时如何更新输入值?
- multithreading - 最大元素 - 致命错误:所有 goroutine 都处于睡眠状态 - 死锁
- javascript - 简单的ajax和php请求
- c# - 如何使用 MVVM 模式启动错误弹出窗口?