database/sql详细使用示例
时间: 2023-08-14 21:04:59 浏览: 89
数据库SQL实例
4星 · 用户满意度95%
database/sql是Go语言内置的数据库操作包,它提供了通用的接口来操作各种类型的关系型数据库。下面是一个详细的使用示例:
```go
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 创建数据库连接
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/database_name")
if err != nil {
panic(err)
}
defer db.Close()
// 测试连接是否成功
err = db.Ping()
if err != nil {
panic(err)
}
// 执行查询语句
rows, err := db.Query("SELECT * FROM user")
if err != nil {
panic(err)
}
defer rows.Close()
// 遍历查询结果
for rows.Next() {
var id int
var name string
var age int
err = rows.Scan(&id, &name, &age)
if err != nil {
panic(err)
}
fmt.Printf("id: %d, name: %s, age: %d\n", id, name, age)
}
// 插入数据
result, err := db.Exec("INSERT INTO user(name, age) VALUES (?, ?)", "Tom", 20)
if err != nil {
panic(err)
}
lastInsertId, err := result.LastInsertId()
if err != nil {
panic(err)
}
fmt.Printf("last insert id: %d\n", lastInsertId)
// 更新数据
result, err = db.Exec("UPDATE user SET age = ? WHERE name = ?", 21, "Tom")
if err != nil {
panic(err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
panic(err)
}
fmt.Printf("rows affected: %d\n", rowsAffected)
// 删除数据
result, err = db.Exec("DELETE FROM user WHERE name = ?", "Tom")
if err != nil {
panic(err)
}
rowsAffected, err = result.RowsAffected()
if err != nil {
panic(err)
}
fmt.Printf("rows affected: %d\n", rowsAffected)
}
```
在上面的示例中,首先创建了一个数据库连接,并执行了一个简单的查询语句,然后遍历了查询结果。接着插入了一条数据,并输出了它的自增ID。然后更新了一条数据,并输出了影响的行数。最后删除了一条数据,并输出了影响的行数。
需要注意的是,为了避免SQL注入攻击,使用Exec、Query等方法时应该使用参数占位符,而不是将参数直接拼接到SQL语句中。在本例中,我们使用了问号作为占位符。在执行SQL语句时,可以传递一个可变数量的参数来替换占位符。例如,"INSERT INTO user(name, age) VALUES (?, ?)"中的两个问号分别表示name和age两个参数。在执行时,可以像这样传递参数:"Tom", 20。
另外,需要注意的是,在使用完查询结果之后,必须调用rows.Close()方法来释放资源。另外,为了保证数据库连接的及时释放,建议使用defer语句来关闭数据库连接。
阅读全文