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 回复

你需要安装 gcc

更多关于Golang连接SQLite数据库的方法与实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我尝试了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即可解决编译问题。

回到顶部