go操作mysql

package main

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

type Person struct {
    Id   int    `db:"id"`
    Name string `db:"name"`
    Age      string `db:"age"`
}

var Db *sqlx.DB

func init() {
    database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test")
    if err != nil {
        fmt.Println("open mysql failed,", err)
		defer Db.Close()  // 注意这行代码要写在上面err判断的下面
        return
    }
    Db = database
}

func insertRecord(){
    r, err := Db.Exec("insert into person(name, age)values(?, ?)", "stu001",15)
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }
    id, err := r.LastInsertId()
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }

    fmt.Println("insert succ:", id)
}

func delRecord(){
    r, err := Db.Exec("delete from person where id=?", 32)
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }
    id, err := r.RowsAffected()
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }

    fmt.Println("delete succ:", id)
}

func updateRecord(){
    r, err := Db.Exec("update person set name=? where id=?", "hello", 29)
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }
    id, err := r.RowsAffected()
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }

    fmt.Println("update succ:", id)
}

func queryList(){
	var person []Person
    err := Db.Select(&person, "select * from person")
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }
    // id, err := r.RowsAffected()
    // if err != nil {
    //     fmt.Println("exec failed, ", err)
    //     return
    // }

    fmt.Println("query succ:", person)
}

func main() {

	//增
	//insertRecord();

	//删
	//delRecord();

	//改
	//updateRecord();

	//查
	queryList();
}

建表

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

编码

### 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、付费专栏及课程。

余额充值