在 Go 中使用 SQLite3 数据库,最常见的方法是使用 github.com/mattn/go-sqlite3
这个库。下面是如何在 Go 中使用 SQLite3 的一个简单指南。
1. 安装 SQLite3 Driver
首先,你需要安装 SQLite3 的 Go 驱动。可以使用以下命令:
代码语言:bash复制go get github.com/mattn/go-sqlite3
2. 导入库
在你的 Go 代码中,你需要导入 database/sql
和 github.com/mattn/go-sqlite3
:
import (
"database/sql"
"log"
_ "github.com/mattn/go-sqlite3"
)
注意 _
前缀用于匿名导入,使得该包的 init
函数执行,但不直接使用该包中的任何其他东西。
3. 创建或打开 SQLite 数据库
使用 sql.Open
函数来打开一个数据库,如果数据库不存在,它会被创建:
db, err := sql.Open("sqlite3", "example.db")
if err != nil {
log.Fatal(err)
}
defer db.Close() // 在函数结束时关闭数据库连接
4. 创建表
可以使用 SQL 语句创建表:
代码语言:go复制sqlStmt := `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);`
_, err = db.Exec(sqlStmt)
if err != nil {
log.Fatalf("%q: %s", err, sqlStmt)
}
5. 插入数据
插入数据可以使用 Exec
方法:
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
_, err = stmt.Exec("Alice")
if err != nil {
log.Fatal(err)
}
6. 查询数据
查询数据可以使用 Query
方法:
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Printf("ID: %d, Name: %s", id, name)
}
7. 错误处理
在实际的应用程序中,确保对错误进行适当的处理是至关重要的。在上面的代码中,log.Fatal(err)
用于记录错误并退出程序,你可以根据需要调整错误处理逻辑。
完整示例
以下是一个完整的示例代码,展示了如何使用 SQLite3:
代码语言:go复制package main
import (
"database/sql"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// 打开数据库
db, err := sql.Open("sqlite3", "example.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 创建表
sqlStmt := `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);`
_, err = db.Exec(sqlStmt)
if err != nil {
log.Fatalf("%q: %s", err, sqlStmt)
}
// 插入数据
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
_, err = stmt.Exec("Alice")
if err != nil {
log.Fatal(err)
}
_, err = stmt.Exec("Bob")
if err != nil {
log.Fatal(err)
}
// 查询数据
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Printf("ID: %d, Name: %s", id, name)
}
// 检查查询错误
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}