사용자 정보를 저장하려면 데이터베이스가 필요하고, 주문을 저장하려면 데이터베이스가 필요합니다. 오늘날 개발은 데이터에 의해 주도됩니다.
그러나 Mysql
Mysql
,Oracle
,SQL Server
。
本篇就示例如何Go操作Mysql
, Oracle
SQL Server
🎜🎜. 🎜🎜🎜本다음은 Go🎜🎜Mysql
🎜🎜. 🎜🎜
이번에는 go mod
go mod
进行包依赖管理,还不会使用的向上爬梯子,找go mod
用法。
使用的库是第三方库go-sql-driver/mysql
패키지 종속성 관리. 사용법을 모른다면 사다리 위로 올라가서 go mod
사용 라이브러리는 타사 라이브러리입니다
go-sql-driver/mysql
.
code
func main() { var username = "root" var password = "rootroot" var ip = "127.0.0.1" var port = "3306" var data = "go_mysql_demo" var dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, data) //Open只会验证dsb的格式是否正确,不会验证是否连接成功,同理,密码是否正确也不知道 db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } //关闭连接在 err 之后,因为可能直接就打开不成功,关闭一个没有打开的连接??? defer db.Close() // 此时尝试连接数据库,会判断用户,密码,ip地址,端口是否正确 err = db.Ping() if err != nil { fmt.Println("连接数据库失败,",err) return } //设置与数据库建立连接的最大数目,一般不管 db.SetMaxOpenConns(100) //设置连接池中的最大闲置连接数,一般不管 db.SetMaxIdleConns(50) }
sql .Open
sql.Open
只会验证格式是否正确,不会连接数据库。
db.Close
在err
之后,是因为可能打开不成功,关闭一个没有打开的连接。
db.Ping
只会验证格式是否正确,不会连接数据库。db.Close
재err
之后,是因为可能打开不成功,关闭一个没有打开的连接。db.Ping
,
🎜🎜ip地址🎜🎜🎜,🎜🎜🎜端口🎜 🎜🎜是否正确。🎜🎜🎜🎜🎜🎜准备工작품저널CREATE TABLE `userinfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `phone` char(11) DEFAULT NULL, `address` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
假设上述工作都完成了啊。
不知道有没有想过,我们查询的数据,存成啥?,字符串?map?切片?,似乎都不是太好。
只有结构体是最清晰的,最好认识的。
结构体
type Userinfo struct { Id int64 `json:"id"` Name string `json:"name"` Phone string `json:"phone"` Address string `json:"address"` }
单条查询使用QueryRow
方法。
代码
//查询单条 sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" var user Userinfo /* QueryRow 第二个参数可以接收多个参数,同理,sqlStr可以有多个 ?占位符 进行匹配 QueryRow 之后必须调用Scan方法进行数据绑定,进行数据库链接释放 */ err = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address) if err != nil { fmt.Println("查询失败", err) return } fmt.Println(user)
执行结果
多行查询使用Query
。
代码
//查询多条 sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" //参数同 QueryRow rows, err := db.Query(sqlStr, 1) if err != nil { fmt.Println("查询失败:", err) return } // 此处使用rows释放所有链接 defer rows.Close() //循环整理所有数据 var userList = make([]Userinfo, 0, 10) for rows.Next() { var user Userinfo err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address) if err != nil { fmt.Println("绑定数据失败", err) return } userList = append(userList, user) } fmt.Println(userList)
执行结果
插入数据需要用到Exec
。
代码
//插入数据 sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);" result, err := db.Exec(sqlStr, "吴彦祖", 555, "不知道哪的") if err != nil { fmt.Println("插入失败", err) return } //受影响的行数 row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) lastId, err := result.LastInsertId() if err != nil { fmt.Println("新增行id获取失败:", err) return } fmt.Println("新增行id:", lastId) fmt.Println("插入成功")
执行结果
Mysql
更新和添加差不多,用的都是Exec
。
代码
//更新数据 sqlStr := `UPDATE userinfo set name=? where id=?;` result, err := db.Exec(sqlStr, "吴彦祖666", 3) if err != nil { fmt.Println("更新失败", err) return } //受影响的行数 row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) fmt.Println("更新成功")
执行结果
Mysql
删除数据用的还是Exec
。
代码
//删除数据 sqlStr := "delete from userinfo where id = ?;" result, err := db.Exec(sqlStr, 3) if err != nil { fmt.Println("删除失败", err) return } //受影响的行数 row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) fmt.Println("删除成功")
执行结果
Mysql
事物,这个用的就比较多了,通常用在关键的场景。
尤其是转账,张三-10块,李四+10块,这个动作动作是要在一起完成的。
如果任何一个失败了,就要恢复上一次的状态。
我们通常也叫这个操作叫做原子操作,要成功,都成功,要完蛋,都完蛋。
CREATE TABLE `bill` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(8) NOT NULL, `money` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
张三和李四都剩余100块
Go 关于事物有三个方法
Begin()
开始事物。
Commit()
提交事物。
Rollback()
失败回滚。
代码
func main() { //事物 //开启事物 tx, err := db.Begin() if err != nil { //释放事物 if tx != nil { tx.Rollback() } fmt.Println("事物开启失败") return } 张三减10块Sql := `UPDATE bill set money=money - 10 where name = ?;` result, err := tx.Exec(张三减10块Sql, "张三") if err != nil { //有错误表示更是失败,回滚原来状态 tx.Rollback() fmt.Println(err) return } 张三受影响行数, err := result.RowsAffected() if err != nil { tx.Rollback() // 回滚 return } 李四加10块Sql := `UPDATE bill set money=money + 10 where name = ?;` result, err = tx.Exec(李四加10块Sql, "李四") if err != nil { //有错误表示更是失败,回滚原来状态 tx.Rollback() fmt.Println(err) return } 李四受影响行数, err := result.RowsAffected() if err != nil { tx.Rollback() // 回滚 return } //都等于1表示成功,可以提交事务,修改数据 if 张三受影响行数==1 && 李四受影响行数==1{ //提交事务 fmt.Println("提交事务") tx.Commit() }else{ //有一个!=1表示没有更新成功,可能用户不存在 fmt.Println("失败了,事物回滚了") tx.Rollback() } fmt.Println("事物执行成功") }
执行结果
Mysql
一加一减
Mysql
물건을 사용하면 오류가 발생하더라도 데이터는 변경되지 않습니다.
이번에는 Go가 MySQL을 어떻게 운영하는지, 추가, 삭제, 수정 및 확인을 수행하는 방법, 그리고 마지막으로 무엇이 무엇인지에 대해 주로 설명합니다. , 작업 방법 .
위 내용은 Go 언어 운용 MySQL 언어 기본 지식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!