文章目录
- 一、sqlite
- 使用sqlite3命令行工具创建数据库,查询数据
- 二、关于mattn/go-sqlite3
- 三、mattn/go-sqlite3使用
- 四、go 使用sqlite常见问题总结
- window下编译报错:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 require
- window下编译报错:cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
- 报错:sql: unknown driver "sqlite3" (forgotten import?)
一、sqlite
SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置和管理一个单独的服务。这也使得 SQLite 是一种非常轻量级的数据库解决方案,非常适合小型项目、嵌入式数据库或者测试环境中。
SQLite 的一些主要特性包括:
- 无服务器的:SQLite 不是一个单独的服务进程,而是直接嵌入到应用程序中。它直接读取和写入磁盘文件。
- 事务性的:SQLite 支持
- ACID(原子性、一致性、隔离性、持久性)属性,能够确保所有事务都是安全、一致的,即使在系统崩溃或者电力中断的情况下。
- 零配置的:SQLite 不需要任何配置或者管理,这使得它非常容易安装和使用。
- 自包含的:SQLite 是一个自包含系统,这意味着它几乎不依赖其他任何外部系统或者库,这使得 SQLite 的跨平台移植非常方便。
- 小型的:SQLite 非常小巧轻量,全功能的 SQLite 数据库引擎的大小只有几百KB。
- 广泛应用:SQLite 被广泛应用在各种各样的产品和系统中,包括手机、平板电脑、嵌入式系统、物联网设备等。它也被广泛用于网站开发、科学研究、数据分析等领域。
在一些轻量级的应用场景下,SQLite 是一个非常理想的选择,因为它简单、高效、易于使用和部署。然而,对于需要处理大量并发写操作或者需要更高级的功能(如用户管理或者存储过程等)的应用场景,更全功能的数据库系统(如 PostgreSQL 或 MySQL)可能会是更好的选择。
使用sqlite3命令行工具创建数据库,查询数据
sudo apt install sqlite3
sqlite3 --version
运行以下命令启动 sqlite3 工具,并指定要创建的数据库文件名(例如 mydatabase.db):
sqlite3 sqlite.db
在 sqlite3 提示符下,输入 .tables 命令来列出数据库中的所有表:
.tables
SELECT * FROM notifications;
退出命令行环境:.quit
/.exit
二、关于mattn/go-sqlite3
github:https://github.com/mattn/go-sqlite3
官方文档:https://pkg.go.dev/github.com/mattn/go-sqlite3?utm_source=godoc
github.com/mattn/go-sqlite3:这是一个流行的 SQLite3 驱动程序,支持 SQLite 的大多数功能。它是官方 SQLite C 语言库的绑定,使用广泛且有很多用户。
三、mattn/go-sqlite3使用
To compile this package on Linux, you must install the development tools for your linux distribution.
Ubuntu
sudo apt-get install build-essential
package mainimport ("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()// 创建表和清空表数据_, err = db.Exec(`CREATE TABLE IF NOT EXISTS foo (id INTEGER PRIMARY KEY,name TEXT);DELETE FROM foo;`)if err != nil {log.Fatal(err)}// 开启事务tx, err := db.Begin()if err != nil {log.Fatal(err)}defer tx.Rollback() // 注意:如果出现错误,及时回滚事务// 准备插入语句stmt, err := tx.Prepare("INSERT INTO foo(id, name) VALUES(?, ?)")if err != nil {log.Fatal(err)}defer stmt.Close()// 执行插入操作for i := 0; i < 100; i++ {_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))if err != nil {log.Fatal(err)}}// 提交事务err = tx.Commit()if err != nil {log.Fatal(err)}// 查询数据并打印rows, err := db.Query("SELECT id, name FROM foo")if err != nil {log.Fatal(err)}defer rows.Close()for rows.Next() {var id intvar name stringerr = rows.Scan(&id, &name)if err != nil {log.Fatal(err)}log.Println(id, name)}err = rows.Err()if err != nil {log.Fatal(err)}
}
四、go 使用sqlite常见问题总结
window下编译报错:Binary was compiled with ‘CGO_ENABLED=0’, go-sqlite3 require
s cgo to work. This is a stub
go-sqlite3 需要使用 CGO 才能正常工作。
解决方法,设置环境变量 CGO_ENABLED=1,让编译时候开启cgo
window下编译报错:cgo: C compiler “gcc” not found: exec: “gcc”: executable file not found in %PATH%
使用 CGO 编译需要安装 C 编译器。在 Windows 系统上,安装 C 编译器是为了支持 CGO 的编译过程。
CGO 是 Go 语言的一个功能,允许在 Go 代码中调用 C 语言代码。为了支持这种跨语言调用,CGO 需要依赖 C 编译器来编译和链接 C 代码。
在 Windows 上,常见的 C 编译器包括 MinGW-w64、TDM-GCC 等。安装其中一个 C 编译器后,将其可执行文件所在的路径添加到系统的 PATH 环境变量中,这样 Go 语言就能够找到并使用 C 编译器进行 CGO 编译。
所以,如果您在 Windows 上需要使用 CGO 编译 Go 代码,确保您已经安装了 C 编译器,并将其路径添加到系统的 PATH 环境变量中。
官方readme中也有说明:
https://github.com/mattn/go-sqlite3#linux
官方推荐的是 TDM-GCC 。
TDM-GCC 和 MinGW-w64 都是在 Windows 环境下常用的 C/C++ 编译器套件,用于支持 CGO 编译。
TDM-GCC:
TDM-GCC 是基于 MinGW 的一个分支,提供了一组预编译的 Windows 版本的 GCC 工具链。
TDM-GCC 比较容易安装和配置,适合入门用户。
TDM-GCC 提供了更好的兼容性和稳定性,以及更好的支持和维护。
总结:于大多数用户来说,TDM-GCC 是一个良好的选择,因为它易于安装和使用,并且提供了稳定的 Windows 版本的 GCC 工具链。
报错:sql: unknown driver “sqlite3” (forgotten import?)
由于忘记导入 “github.com/mattn/go-sqlite3” 包导致的。
在您的代码中,请确保在使用 SQLite 驱动程序之前,通过添加以下导入语句来导入 “github.com/mattn/go-sqlite3” 包:
import _ "github.com/mattn/go-sqlite3"
这将确保 SQLite 驱动程序正确注册,并使您能够在代码中使用 “sqlite3” 驱动程序名称。