Golang操作sqlite3数据库的详细教程
本文介绍了如何在Go语言中使用内置的 database/sql 包配合 github.com/mattn/go-sqlite3 驱动来操作SQLite数据库。内容包含连接设置、建表插入、数据查询及参数化预处理等关键功能演示。
SQLite概述
SQLite是一款嵌入式关系型数据库引擎,具有自包含、无服务、零配置并支持事务的特点。在开发过程中,SQLite常被用于产品快速验证、部署测试或演示环节。Go语言通过内置的 sql 包提供通用的数据库接口,但必须配合具体的数据库驱动程序才能正常工作。
环境准备与数据库创建
在进行代码开发前,建议先熟悉基本的命令行操作。可以通过以下步骤安装工具并创建一个空的数据库文件:
- 安装sqlite3工具: 执行命令
sudo apt install sqlite3。 - 创建/打开数据库: 运行
sqlite3 test.db。如果test.db不存在则自动创建,存在则打开。 - 验证文件: 退出数据库会话后,使用
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 数据库的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









