Golang Go语言中是否可以把本地的 SQLite 文件打包进可执行程序?

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中是否可以把本地的 SQLite 文件打包进可执行程序?

Golang 可以用 bin-data 或者 packr 等打包工具,把一些如 css, html, js 的文件和可执行程序打包在一起执行。

我想也把 SQLite 的文件也同时打包进去,这个程序只有读取的操作,没有增删改的操作,因此就不用担心如何更新打包到可执行程序里的 SQLite 文件了。

25 回复

那就是个普通文件,没问题啊

更多关于Golang Go语言中是否可以把本地的 SQLite 文件打包进可执行程序?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


换个思路 在执行过程中 把 sqllite 从远程下载到某个目录并加载

把整个二进制文件转成 16 进制字符串嵌到你的代码里,运行的时候写到一个临时文件里 然后 sqlite 加载

都在代码里面了 不用再临时文件了吧 直接读内存咯

怎么搞,求代码

用 base64 也可以

#2 文件有点大,而且没有服务器

#1 golang 的 sqlite 包只能用 Connection String 链接

go-bin-data + go generate 在构建的时候打包进去就行

go 的 sqlite 是 cgo binding,sqlite 本身是支持内存数据库的,只不过坊间传言好像锁会失效。

另外如果用 Go 的 afero 这种虚拟文件系统,可能会因为 cgo 的原因,c 代码不能感知。

#9 内存数据库也得要通过 Connection String 来链接,我只有把 sqlite 文件打包进可执行程序,然后程序解压放到临时目录然后再读取了。

#10 Go 的 afero 好像是一个跨平台的文件管理的包吧

那还用啥 SQLite ??

#13 那用啥?

如果文件比较大,那么不管采用什么方法,都只能要么每次启动时全部读进内存,要么每次启动时写临时文件。感觉还不如在第一次启动时检查与程序相同目录下有没有 sqlite 数据库文件,没有就生成一个,以后直接使用。

3 楼正解,理论上是可行的,但是有什么必要呢?

何必,和程序一起发布不就行了

换个思路,你直接把 sql 打进可执行文件,启动的时候创建一个内存数据库,再把数据写进去


你用 sqlite 不是还要用 gosql 去操作,写个对应表结构的 struct
那为啥不直接写好 struct 然后代码里用 const 写一遍就行了呗。就是这个代码文件会很长,但是可以自动生成啊

#20 明白,这样也行。

#19 这个还是不行,没法用 go-sqlite3 访问 sqlite 的文件

SQLite 有 VFS 的功能 https://www.sqlite.org/vfs.html
大概可以自己实现一个内存 VFS。
不考虑 Windows 的话大概还可以用 open_memstream https://linux.die.net/man/3/open_memstream

在Go语言中,将本地的SQLite文件直接打包进可执行程序并不是一种直接支持的功能,但可以通过一些技巧来实现类似的效果。

一种常见的方法是使用Go的嵌入功能(Go 1.16及以上版本支持),将SQLite文件的内容以字节切片的形式嵌入到程序中。在程序启动时,你可以将这些字节切片写入到一个临时文件或内存文件系统(如github.com/stretchr/testify/fs中的内存文件系统)中,然后让SQLite驱动连接到这个临时文件或内存文件。

这种方法的好处是,你可以将SQLite数据库和程序一起分发,而无需额外的安装步骤。然而,需要注意的是,对于大型数据库文件,这种方法可能会增加可执行文件的大小,并可能影响程序的启动时间,因为需要在启动时解压和写入文件。

另一种方法是,将SQLite数据库文件作为程序的资源文件分发,并在程序运行时动态加载。这种方法避免了将数据库文件打包进可执行文件的复杂性,但需要在程序外部管理这些文件。

总的来说,虽然Go语言没有直接提供将SQLite文件打包进可执行程序的功能,但你可以通过嵌入功能或外部资源管理来实现类似的效果。选择哪种方法取决于你的具体需求和程序的大小、复杂性等因素。

回到顶部