golang常用库之-操作sqlite数据库

文章讨论了如何在SQLite中使用sqlite3命令行工具创建和修改数据库,以及遇到的问题,如Navicat查看旧数据、cgo编译错误和数据库同步。重点提到了mattn/go-sqlite3库,并给出了解决事务管理和同步设置的建议。
摘要由CSDN通过智能技术生成

一、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

navicat查询的数据后,然后python修改sqlite表记录,然后,使用sqlite命令行查看已经被修改,但是navicat刷新查看还是老数据?

问题描述:
Samba 共享的 SQLite文件,navicat查询的数据后,然后python修改sqlite表记录,然后,使用sqlite命令行查看已经被修改,但是navicat刷新查看还是老数据。

问题分析:

  1. 可能是由于 Navicat 的缓存机制或其他设置导致的。
  2. 事务问题:在代码中没有看到使用事务来包装更新操作。如果在更新数据时没有使用事务,并且 Navicat 正在查询或浏览数据库的数据,可能会导致 Navicat 在事务提交之前看到旧的数据。可以尝试在更新操作中使用事务,确保数据的一致性和可见性。

问题解决:
确保将修改的数据写入到数据库文件中,可以通过执行 commit() 方法来提交事务。在 Python 中,当使用连接对象的 commit() 方法时,SQLite 会将缓存中的修改写入到磁盘上的数据库文件中,以确保持久化存储。

经过测试还是不太行:
执行适当的 PRAGMA 语句,你可以查看当前 SQLite 数据库的各种配置选项的值。
在 SQLite 中,控制 commit() 操作是否立即将数据写入磁盘文件的行为是由 PRAGMA synchronous 设置控制的。该设置用于控制事务的同步写入行为。

默认情况下,SQLite 使用 FULL 设置,表示每次修改都会同步写入磁盘。这意味着在每次调用 commit() 时,数据都会立即写入磁盘文件。
如果你希望 SQLite 在执行 commit() 时立即将数据写入磁盘,可以使用以下方式设置 PRAGMA synchronous:
返回当前的 synchronous 设置的值,例如 0、1 或 2,分别对应不同的设置选项。

  • 0:表示不同步写入。即在 commit() 操作时,不会立即将数据写入磁盘,而是将其缓存在内存中,并在稍后的时间内进行批量写入。这是最快的设置,但也是最不安全的,因为在系统崩溃或断电时可能会丢失数据。

  • 1:表示同步写入。即在每次 commit() 操作时,都会立即将数据写入磁盘文件。这是最安全的设置,但也可能会对性能产生一定的影响。

  • 2:表示自动选择同步模式。SQLite 将根据系统和文件系统的特性来自动选择同步模式,以平衡性能和数据持久性的需求。

在 SQLite 中,PRAGMA synchronous 设置是一个会话级别的设置,修改后只对当前会话有效。在 SQLite 命令行中执行 PRAGMA synchronous = FULL; 并不会立即反映在后续的查询中。

要在 SQLite 中全局设置,在每次提交事务时立即将数据写入磁盘,可以使用以下方式:

在 Python 中,创建数据库连接后,执行以下语句设置全局的 synchronous 设置:

conn.execute("PRAGMA synchronous = FULL")

这将使所有在该连接上执行的事务,在每次提交时立即将数据写入磁盘。

如果你使用的是命令行工具,可以在每次打开 SQLite 数据库之前,执行以下命令设置全局的 synchronous 设置:

PRAGMA synchronous = FULL;

经过测试,效果还是不行,这里暂时使用本地sqlite命令行方式

二、关于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 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()

	// 创建表和清空表数据
	_, 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 int
		var name string
		err = 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” 驱动程序名称。

sqlite图形化工具

DB Browser for SQLite(免费)

Github开源地址:https://github.com/sqlitebrowser/sqlitebrowser
下载地址:https://sqlitebrowser.org/
工具简介
DB Browser for SQLite是一个高质量、可视化、开源的工具,用于创建、设计和编辑与SQLite兼容的数据库文件。它适用于想要创建、搜索和编辑数据库的用户和开发人员。DB Browser for SQLite使用熟悉的类电子表格界面,因此无需学习复杂的SQL命令。

支持系统

  • Windows
  • macOS
  • Linux
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值