发布时间:2024-12-23 03:01:14
例如,我们可以使用MySQL驱动程序连接到一个MySQL数据库:
```go import "database/sql" import _ "github.com/go-sql-driver/mysql" func main() { db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database") if err != nil { panic(err.Error()) } defer db.Close() } ``` 在上面的代码中,我们使用"mysql"作为数据库驱动名称,"user:password@tcp(127.0.0.1:3306)/database"作为连接字符串,其中"user"和"password"分别是数据库的用户名和密码,"127.0.0.1:3306"是数据库服务器的地址和端口,"database"是要连接的数据库名。下面是一个使用Exec方法执行插入操作的示例:
```go stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)") if err != nil { panic(err.Error()) } defer stmt.Close() result, err := stmt.Exec("John Doe", 30) if err != nil { panic(err.Error()) } affectedRows, err := result.RowsAffected() if err != nil { panic(err.Error()) } fmt.Printf("Inserted %d rows\n", affectedRows) ``` 在上面的代码中,我们首先使用Prepare方法准备一个SQL语句,然后使用Exec方法执行该SQL语句。执行成功后,我们可以通过RowsAffected方法获取受影响的行数。下面是一个使用Query方法查询数据的示例:
```go rows, err := db.Query("SELECT name, age FROM users") if err != nil { panic(err.Error()) } defer rows.Close() for rows.Next() { var name string var age int if err := rows.Scan(&name, &age); err != nil { panic(err.Error()) } fmt.Printf("Name: %s, Age: %d\n", name, age) } if err := rows.Err(); err != nil { panic(err.Error()) } ``` 在上述代码中,我们首先使用Query方法执行一个SELECT查询语句,然后通过Next方法逐行读取查询结果。在每行数据被读取后,我们使用Scan方法将查询结果赋值给变量。下面是一个使用事务处理的示例:
```go tx, err := db.Begin() if err != nil { panic(err.Error()) } stmt, err := tx.Prepare("INSERT INTO users(name, age) VALUES(?, ?)") if err != nil { tx.Rollback() panic(err.Error()) } defer stmt.Close() _, err = stmt.Exec("John Doe", 30) if err != nil { tx.Rollback() panic(err.Error()) } _, err = stmt.Exec("Jane Smith", 25) if err != nil { tx.Rollback() panic(err.Error()) } if err := tx.Commit(); err != nil { panic(err.Error()) } ``` 在上述代码中,我们首先使用Begin方法开始一个事务,然后使用Prepare方法准备一个插入语句,在事务中执行多次插入操作。如果任何一次插入操作失败,我们将使用Rollback方法回滚事务;否则,我们将使用Commit方法提交事务。