Golang连接SQLite数据库的方法与实践
Golang连接SQLite数据库的方法与实践
package main
import (
"database/sql"
"fmt"
"time"
"github.com/mattn/go-sqlite3 "
)
在命令行中安装时执行: go get github.com/mattn/go-sqlite3
错误:在路径中找不到gcc可执行文件
6 回复
我尝试了MinGW但出现了同样的错误
那么你是在使用Windows系统吗?
你是否在POSIX包装器中明确安装了GCC?
如果你不需要Windows可执行文件,有没有尝试过使用WSL?
看起来你的项目还处于非常早期的阶段。请查看 https://github.com/avelino/awesome-go#database 来了解大多数可以与Go配合使用的数据库。你可以选择不需要gcc进行编译的数据库。
否则,正如其他人指出的那样,你需要安装gcc,因为go-sqlite-3是一个cgo包。
我在Linux机器上能够顺利拉取下来。可能问题已经修复了。你能再试一次吗?
go get github.com/mattn/go-sqlite3
echo $?
0
gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
uname -a
Linux dev-vm 3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
要解决在Windows系统中使用go-sqlite3时遇到的"找不到gcc可执行文件"错误,需要安装GCC编译器。以下是完整的解决方案和连接SQLite数据库的实践代码。
解决方案
1. 安装MinGW-w64(包含GCC)
下载并安装MinGW-w64,确保将bin目录(如C:\mingw64\bin)添加到系统PATH环境变量中。
2. 验证GCC安装
在命令行中执行:
gcc --version
完整的SQLite连接示例
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// 打开数据库连接(如果不存在则创建)
db, err := sql.Open("sqlite3", "./test.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 创建表
createTableSQL := `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
_, err = db.Exec(createTableSQL)
if err != nil {
log.Fatal(err)
}
// 插入数据
insertSQL := "INSERT INTO users (name, email) VALUES (?, ?)"
result, err := db.Exec(insertSQL, "张三", "zhangsan@example.com")
if err != nil {
log.Fatal(err)
}
id, _ := result.LastInsertId()
fmt.Printf("插入成功,ID: %d\n", id)
// 查询数据
rows, err := db.Query("SELECT id, name, email, created_at FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name, email string
var createdAt time.Time
err = rows.Scan(&id, &name, &email, &createdAt)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, 姓名: %s, 邮箱: %s, 创建时间: %s\n",
id, name, email, createdAt.Format("2006-01-02 15:04:05"))
}
// 更新数据
updateSQL := "UPDATE users SET email = ? WHERE name = ?"
_, err = db.Exec(updateSQL, "new_email@example.com", "张三")
if err != nil {
log.Fatal(err)
}
// 删除数据
deleteSQL := "DELETE FROM users WHERE name = ?"
_, err = db.Exec(deleteSQL, "张三")
if err != nil {
log.Fatal(err)
}
}
事务操作示例
func transactionExample(db *sql.DB) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer func() {
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
}()
// 执行多个操作
_, err = tx.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "李四", "lisi@example.com")
if err != nil {
return err
}
_, err = tx.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "王五", "wangwu@example.com")
if err != nil {
return err
}
return nil
}
预处理语句示例
func preparedStatementExample(db *sql.DB) error {
stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")
if err != nil {
return err
}
defer stmt.Close()
users := []struct {
name string
email string
}{
{"赵六", "zhaoliu@example.com"},
{"钱七", "qianqi@example.com"},
{"孙八", "sunba@example.com"},
}
for _, user := range users {
_, err := stmt.Exec(user.name, user.email)
if err != nil {
return err
}
}
return nil
}
安装GCC后重新执行go get github.com/mattn/go-sqlite3即可解决编译问题。

