23 个回答
wangsongyan 2019-08-03 16:25:21
那就是个普通文件,没问题啊
niuoh 2019-08-03 16:36:12
换个思路 在执行过程中 把 sqllite 从远程下载到某个目录并加载
keepeye 2019-08-03 17:01:44
把整个二进制文件转成 16 进制字符串嵌到你的代码里,运行的时候写到一个临时文件里 然后 sqlite 加载
Rheinmetal 2019-08-03 17:45:19
都在代码里面了 不用再临时文件了吧 直接读内存咯
TangMonk 2019-08-03 17:46:57
@Rheinmetal 怎么搞,求代码
TangMonk 2019-08-03 17:52:40
@keepeye 用 base64 也可以
TangMonk 2019-08-03 17:56:41
@niuoh #2 文件有点大,而且没有服务器
TangMonk 2019-08-03 17:57:42
@wangsongyan #1 golang 的 sqlite 包只能用 Connection String 链接
Reficul 2019-08-03 18:07:06
go-bin-data + go generate 在构建的时候打包进去就行
Reficul 2019-08-03 18:10:43
go 的 sqlite 是 cgo binding,sqlite 本身是支持内存数据库的,只不过坊间传言好像锁会失效。

另外如果用 Go 的 afero 这种虚拟文件系统,可能会因为 cgo 的原因,c 代码不能感知。
TangMonk 2019-08-03 18:25:51
@Reficul #9 内存数据库也得要通过 Connection String 来链接,我只有把 sqlite 文件打包进可执行程序,然后程序解压放到临时目录然后再读取了。
TangMonk 2019-08-03 18:57:50
@Reficul #10 Go 的 afero 好像是一个跨平台的文件管理的包吧
rrfeng 2019-08-03 20:18:59
那还用啥 SQLite ??
TangMonk 2019-08-03 20:32:48
@rrfeng #13 那用啥?
SuperMild 2019-08-03 21:05:47
如果文件比较大,那么不管采用什么方法,都只能要么每次启动时全部读进内存,要么每次启动时写临时文件。感觉还不如在第一次启动时检查与程序相同目录下有没有 sqlite 数据库文件,没有就生成一个,以后直接使用。
AlvaIM 2019-08-03 21:12:28
3 楼正解,理论上是可行的,但是有什么必要呢?
reus 2019-08-03 22:23:44
何必,和程序一起发布不就行了
wangsongyan 2019-08-03 22:38:51
@TangMonk 换个思路,你直接把 sql 打进可执行文件,启动的时候创建一个内存数据库,再把数据写进去
ksedz  1 2019-08-03 22:43:24
感觉这个可以满足要求
https://github.com/rakyll/statik
rrfeng 2019-08-03 23:40:23
@TangMonk
你用 sqlite 不是还要用 gosql 去操作,写个对应表结构的 struct
那为啥不直接写好 struct 然后代码里用 const 写一遍就行了呗。就是这个代码文件会很长,但是可以自动生成啊
TangMonk 2019-08-04 08:36:04
@rrfeng #20 明白,这样也行。
TangMonk 2019-08-04 08:36:36
@ksedz #19 这个还是不行,没法用 go-sqlite3 访问 sqlite 的文件
TangMonk 2019-08-04 08:36:44
答案: https://stackoverflow.com/questions/57326215/how-to-bundle-an-sqlite-database-in-a-go-binary/57338864#57338864