Go语言操作MySQL

章节

  • 写在前面
  • go 操作 MySQL
  • 感想

1.写在前面

接下来的记录中会附带记录当日工作学习到的东西,包括且不限于 技术、软实力-沟通、心态、理财、个人思考等

2.go 操作MySQL

如Java操作数据库,编程逻辑如下:
驱动加载、获取连接(connect)、生成Statement || PrepareStatement 对象、sql传参、exec or query、获取结果集 Resultset,go 操作MySQL的步骤也是如上步骤。

注意:go 加载驱动 需要依靠远程 import 的 驱动包 github.com/go-sql-driver/mysql

如下代码所示,演示了 基础操作 CURD
DbOperate.go

package DB

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

//返回数据库连接句柄
func connDb() *sql.DB {
    db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/demo?charset=utf8")
    checkErr(err)
    return db
}

//insert
func DoInsert(sql string) {
    db := connDb()
    sql = "insert into test(name) value (?)"
    
    stmt, err := db.Prepare(sql)
    checkErr(err)

    res, err := stmt.Exec("bofengliu")
    checkErr(err)

    fmt.Printf("成功了,%v", res)
}

//delete
func DoDelete(id int) {
    db := connDb()
    sql := "delete from test where id = ?"

    stmt, err := db.Prepare(sql)
    checkErr(err)

    res, err := stmt.Exec(id)
    checkErr(err)

    res = nil

    fmt.Println(res)
}

//update
func DoUpdate(name string, id int) int64 {
    db := connDb()
    sql := "update test set name = ? where id = ?"

    stmt, err := db.Prepare(sql)
    checkErr(err)

    res, err := stmt.Exec(name, id)
    checkErr(err)

    affect, err := res.RowsAffected()

    fmt.Println("影响数据集行数为", affect)

    return affect
}

func DoQueryByName(name string) {
    sql := "select * from test where name = \"" + name + "\""
    db := connDb()

    res, err := db.Query(sql)
    checkErr(err)

    for res.Next() {
        var id int
        var name string
        err := res.Scan(&id, &name)
        checkErr(err)

        fmt.Println(id)
        fmt.Println(name)
    }

}

func checkErr(err error) {
    if err != nil {
        panic(err.Error())
    }
}

数据表结构如下所示:

 CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 |

上述代码中通过import 引入了 github.com/go-sql-driver/mysql,注意前方有 _ ,此代表 引入的远程包 不会在代码中直接使用,而是被程序间接加载,加载位置为 db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/demo?charset=utf8")

源代码如下所示:

// 支持多种驱动加载 ,当前程序中加载驱动为MySQL 驱动
func Open(driverName, dataSourceName string) (*DB, error) {
    driversMu.RLock()
    driveri, ok := drivers[driverName]
    driversMu.RUnlock()
    if !ok {
        return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
    }

    if driverCtx, ok := driveri.(driver.DriverContext); ok {
        connector, err := driverCtx.OpenConnector(dataSourceName)
        if err != nil {
            return nil, err
        }
        return OpenDB(connector), nil
    }

    return OpenDB(dsnConnector{dsn: dataSourceName, driver: driveri}), nil
}

经测试 没有问题,此为go 操作 MySQL 初体验。

3.感想

基础要牢靠,越是简单的东西,越需要记录。

完。

### Go语言操作MySQL数据库 #### 连接与初始化 为了在Go语言操作MySQL数据库,首先需要安装`go-sql-driver/mysql`库作为驱动程序。该驱动被官方推荐用于连接和操作MySQL数据库[^3]。通过执行以下命令即可完成驱动的安装: ```bash go get -u github.com/go-sql-driver/mysql ``` 接着,在代码中导入必要的包以便建立数据库连接。通常会使用标准库中的`database/sql`包配合具体的驱动名称来创建连接实例。 ```go import ( "database/sql" _ "github.com/go-sql-driver/mysql" // 驱动注册 ) ``` 获得数据库连接的具体方法如下所示。这里定义了一个函数用来返回已经配置好的SQL句柄对象。 ```go func newDB() (*sql.DB, error) { dataSourceName := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := sql.Open("mysql", dataSourceName) if err != nil { return nil, err } // 测试连接有效性 if err = db.Ping(); err != nil { return nil, err } return db, nil } ``` 上述代码片段展示了如何构建一个完整的DSN字符串,并利用它打开一个新的数据库连接[^4]。注意替换其中的实际参数如用户名、密码、主机地址等以适配您的环境设置。 #### 数据插入 当成功建立了到目标数据库的有效链接之后就可以开始执行各种类型的SQL语句了。下面是一个简单的例子展示怎样向表里添加新纪录: ```go stmt, err := db.Prepare("INSERT INTO users(name,email) VALUES(?,?)") if err != nil { log.Fatal(err) } res, err := stmt.Exec("John Doe","john@example.org") if err != nil { log.Fatal(err) } lastInsertId, err := res.LastInsertId() fmt.Println(lastInsertId) ``` 这段脚本先准备了一条预处理过的SQL指令然后绑定具体值再提交给服务器端去运行最后获取刚产生的主键ID号。 #### 查询数据 对于读取存储于关系型表格内的资料而言有两种常见模式——单记录检索或多结果集扫描。以下是两种方式的例子说明: ##### 单行查询 如果预期只有一项匹配的结果或者只需要第一条满足条件的数据,则可采用此法。 ```go var name string err = db.QueryRow("SELECT name FROM users WHERE id=?", userId).Scan(&name) switch { case err == sql.ErrNoRows: fmt.Printf("User %d not found\n", userId) case err != nil: panic(err.Error()) // handle error properly instead of panicking in real code. default: fmt.Println("Found user:", name) } ``` ##### 多行查询 而面对可能含有多个符合条件项目的场景下则应该运用迭代器遍历整个集合直至结束为止。 ```go rows, err := db.Query("SELECT id,name FROM users ORDER BY created_at DESC LIMIT 10") defer rows.Close() for rows.Next(){ var id int var name string err = rows.Scan(&id,&name) if err!=nil{ break; } fmt.Printf("%d:%s\n",id,name); } ``` 以上两部分分别演示了针对不同需求情况下的基本查询技巧。 #### 更新/删除数据 除了增删查之外还经常涉及到修改现有字段的内容或者是彻底移除某些特定实体的操作过程。这些都可以借助标准化接口轻松达成目的。 更新示例: ```go result,err:=db.Exec("UPDATE users SET email=? WHERE id=?",newEmail,userId) affected,err=result.RowsAffected(); fmt.Printf("Updated %v row(s)\n", affected) ``` 删除示例: ```go result,err=db.Exec("DELETE FROM users WHERE id=?",userId) deleted,err=result.RowsAffected(); fmt.Printf("Deleted %v row(s)\n", deleted) ``` 这两个案例均体现了事务管理的重要性以及影响范围统计功能的应用价值所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值