go操作数据库
go操作数据库
Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口
database/sql
,开发者可以根据定义的接口来开发相应的数据库驱动
接口 | 说明 |
---|---|
sql.Register(name string, driver driver.Driver) | 注册驱动,通过map来保存多个驱动 |
Driver.Open(name string) (Conn, error) | 返回一个数据库的连接,只能在一个goroutine中使用 |
Conn.Prepare(query string) (Stmt, error) | 返回与当前连接相关的执行Sql语句的准备状态,用于增删改查 |
Conn.Close() error | 关闭连接 |
Conn.Begin() (Tx, error) | 返回事务,用于提交、回滚事务 |
Stmt.Exec(args []Value) (Result, error) | 执行增删改语句 |
Stmt.Query(args []Value) (Rows, error) | 执行查询语句 |
。。。
sqlx
操作Mysql
导包
1
2
3
4
5// mysql驱动
go get github.com/go-sql-driver/mysql
// go操作数据库
go get github.com/jmoiron/sqlx注册驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
func main() {
// 用户名:密码@tcp(ip:port)/数据库名
database, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
fmt.Println(database)
}插入操作
db.Exec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type User struct {
UserId int `db:"user_id"`
Username string `db:"username"`
Sex string `db:"sex"`
Email string `db:"email"`
}
var db *sqlx.DB
// 注册驱动,创建操作对象
func init() {
database, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
db = database
}
func main() {
// sql语句
sql := "INSERT INTO test_go_user(`username`, `sex`, `email`) VALUES (?, ?, ?)"
value := [3]string{"user01", "man", "user01@qq.com"}
// 执行sql
res, err := db.Exec(sql, value[0], value[1], value[2])
if err != nil {
fmt.Println("exec failed, ", err)
return
}
// 查看最后一个初入的id
id, err := res.LastInsertId()
if err != nil {
fmt.Println("exec failed", err)
return
}
fmt.Println("insert success", id)
}查询操作
db.Select
1
2
3
4
5
6
7
8
9
10
11func main() {
sql := "SELECT * FROM test_go_user"
var users []User
err := db.Select(&users, sql)
if err != nil {
fmt.Println("select failed, ", err)
}
fmt.Println(users)
}修改操作
db.Exec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17func main() {
sql := "UPDATE test_go_user SET username=? WHERE user_id = ?"
value := []string{"user02", "2"}
res, err := db.Exec(sql, value[0], value[1])
if err != nil {
fmt.Println("exec failed, ", err)
return
}
row, err := res.RowsAffected()
if err != nil {
fmt.Println("exec failed, ", err)
return
}
fmt.Println("影响的行数:", row)
}删除操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16func main() {
sql := "delete from test_go_user where user_id=?"
res, err := db.Exec(sql, 2)
if err != nil {
fmt.Println("exce failed,", err)
return
}
row, err := res.RowsAffected()
if err != nil {
fmt.Println("row failed, ", err)
}
fmt.Println("delete succ: ", row)
}
操作Mysql事务Begin()/Rollback()/Commit()
1 |
|
gorm
Go Object Relational Mapping
导包
1 |
|
创建连接
1 |
|
CRUD
实体类
1 |
|
1 |
|
事务
自动事务
1 |
|
手动提交事务
1 |
|
通过保存点来回滚部分事务
SavePoint(“保存点名”); RollBackTo(“保存点名”)
回调
在回调中如果返回error则会回滚事务,可以用来做入参、出参检查等操作
结构体实现对应的回调,
增:BeforeCreate、AfterCreate
删:BeforeDelete、AfterDelete
改:BeforeUpdate、AfterUpdate
查:AfterFind
1 |
|
go操作数据库
http://xwww12.github.io/2023/11/01/go/go操作数据库/