一、连接数据库
首先,我们需要通过sql.Open函数来连接数据库。这个函数接收两个参数,第一个参数是数据库驱动的名称,第二个参数是连接数据库所需要的信息。例如,如果我们要连接一个MySQL数据库,可以使用如下代码: ```go import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/mydb") if err != nil { panic(err) } defer db.Close() // 数据库操作... } ```在这段代码中,我们使用了MySQL驱动,连接到了本地的3306端口,并指定了数据库名称为mydb。注意,我们还需要在导入包的时候引入mysql的驱动。
二、执行SQL语句
连接数据库成功后,我们就可以通过sql.DB对象来执行SQL语句了。sql.DB对象提供了Exec、Query和QueryRow三个方法来执行不同类型的SQL语句。1. Exec方法用于执行不返回结果集的操作,例如插入、更新和删除等。下面是一个示例:
```go result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "test", 18) if err != nil { panic(err) } affected, _ := result.RowsAffected() fmt.Println("插入影响的行数:", affected) ```2. Query方法用于执行返回结果集的操作,例如查询。下面是一个示例:
```go rows, err := db.Query("SELECT name, age FROM users WHERE id = ?", 1) if err != nil { panic(err) } defer rows.Close() for rows.Next() { var name string var age int err = rows.Scan(&name, &age) if err != nil { panic(err) } fmt.Println(name, age) } ```3. QueryRow方法用于执行返回单行结果的操作,例如查询单个记录。下面是一个示例:
```go var name string var age int err := db.QueryRow("SELECT name, age FROM users WHERE id = ?", 1).Scan(&name, &age) if err != nil { panic(err) } fmt.Println(name, age) ```三、事务处理
在实际开发中,我们经常需要执行一系列相关的SQL语句,并保证它们的执行是原子性的。为此,sql.DB对象也提供了事务处理的方法,可以方便地实现数据库事务。例如,下面的示例展示了如何使用事务处理来确保一系列的插入操作要么全部成功,要么全部失败:
```go tx, err := db.Begin() if err != nil { panic(err) } defer tx.Rollback() stmt, err := tx.Prepare("INSERT INTO users (name, age) VALUES (?, ?)") if err != nil { panic(err) } defer stmt.Close() for i := 0; i < 10; i++ { _, err := stmt.Exec("test" + strconv.Itoa(i), i+10) if err != nil { panic(err) } } err = tx.Commit() if err != nil { panic(err) } ```在这段代码中,我们首先调用db.Begin()方法开启了一个事务,然后通过tx.Prepare()方法准备SQL语句的执行计划,并在循环中通过stmt.Exec()方法执行插入操作。最后,调用tx.Commit()方法提交事务。如果出现任何错误,我们将调用tx.Rollback()方法回滚事务。
四、连接池管理
sql.DB对象还提供了一些连接池管理的方法,可以对数据库连接进行灵活的配置。例如,通过设置MaxIdleConns和MaxOpenConns属性,我们可以控制连接池中空闲连接和打开连接的最大数量。下面是一个示例:
```go db.SetMaxIdleConns(10) db.SetMaxOpenConns(100) ```在这段代码中,我们将连接池的最大空闲连接数设置为10,最大打开连接数设置为100。