Golang操作sqlite3数据库的详细教程

Aria
Aria
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍了如何在Go语言中使用内置的 database/sql 包配合 github.com/mattn/go-sqlite3 驱动来操作SQLite数据库。内容包含连接设置、建表插入、数据查询及参数化预处理等关键功能演示。

SQLite概述

SQLite是一款嵌入式关系型数据库引擎,具有自包含、无服务、零配置并支持事务的特点。在开发过程中,SQLite常被用于产品快速验证、部署测试或演示环节。Go语言通过内置的 sql 包提供通用的数据库接口,但必须配合具体的数据库驱动程序才能正常工作。

环境准备与数据库创建

在进行代码开发前,建议先熟悉基本的命令行操作。可以通过以下步骤安装工具并创建一个空的数据库文件:

  1. 安装sqlite3工具: 执行命令 sudo apt install sqlite3。
  2. 创建/打开数据库: 运行 sqlite3 test.db。如果 test.db 不存在则自动创建,存在则打开。
  3. 验证文件: 退出数据库会话后,使用 ls 命令可以看到生成的 test.db 文件。

打印版本信息

在使用代码连接数据库时,首先需要导入驱动。使用下划线标识符导入可以触发其 init 函数完成驱动的注册。

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// 连接内存数据库
	db, err := sql.Open("sqlite3", ":memory:")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	var version string
	// 查询版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(version)
}

sql.Open 接收驱动名称和数据源名称。:memory: 表示使用内存数据库。执行 QueryRow 后调用 Scan 将结果赋值给变量。

Exec执行DML语句

Exec 函数主要用于执行不返回记录的 SQL 语句(如 INSERT、UPDATE、DELETE)。

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	db, err := sql.Open("sqlite3", "test.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	sts := `
DROP TABLE IF EXISTS cars;
CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INT);
INSERT INTO cars(name, price) VALUES('Audi',52642);
INSERT INTO cars(name, price) VALUES('Mercedes',57127);
INSERT INTO cars(name, price) VALUES('Skoda',9000);
INSERT INTO cars(name, price) VALUES('Volvo',29000);
INSERT INTO cars(name, price) VALUES('Bentley',350000);
INSERT INTO cars(name, price) VALUES('Citroen',21000);
INSERT INTO cars(name, price) VALUES('Hummer',41400);
INSERT INTO cars(name, price) VALUES('Volkswagen',21600);`
	_, err = db.Exec(sts)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("table cars created")
}

此示例首先创建名为 cars 的数据表,并在同一批处理中插入了多行车辆数据。

查询记录

对于需要返回结果的查询(如 SELECT),需使用 Query 方法。结果集是一个迭代器,需要手动关闭。

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	db, err := sql.Open("sqlite3", "test.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	rows, err := db.Query("SELECT * FROM cars")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var name string
		var price int

		err = rows.Scan(&id, &name, &price)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%d %s %d\n", id, name, price)
	}
}

循环调用 rows.Next() 遍历每一行数据,随后使用 Scan 将列值读取到对应的 Go 变量中。

带参数的Prepared Statement

为了提升性能并确保安全(防止 SQL 注入),推荐使用预处理语句(Prepared Statements)中的占位符。

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    db, err := sql.Open("sqlite3", "test.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 方式一:分步预处理
    stm, err := db.Prepare("SELECT * FROM cars WHERE id = ?")
    if err != nil {
        log.Fatal(err)
    }
    defer stm.Close()

    var id int
    var name string
    var price int

    cid := 3
    err = stm.QueryRow(cid).Scan(&id, &name, &price)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%d %s %d\n", id, name, price)

    // 方式二:一步到位
    row := db.QueryRow("SELECT * FROM cars WHERE id = ?", cid)
    // ... Scan 逻辑类似
}

在 SQLite 中,占位符为问号 ?。参数直接传递给 QueryRow 即可进行替换查询。

返回影响行数

DML 语句执行后,通常需要了解实际修改了多少行,可通过 RowsAffected 获取。

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    db, err := sql.Open("sqlite3", "test.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    res, err := db.Exec("DELETE FROM cars WHERE id IN (1, 2, 3)")
    if err != nil {
        log.Fatal(err)
    }

    n, err := res.RowsAffected()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The statement has affected %d rows\n", n)
}

上述代码删除了 ID 为 1, 2, 3 的记录并打印受影响的行数以作验证。

总结

以上就是 Golang 使用 sqlite3 包操作数据库的详细内容,更多关于 Golang 操作 sqlite3 数据库的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表