首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

Golang 是否可以把本地的 SQlite 文件打包进可执行程序?

  •  
  •   TangMonk · 125 天前 · 2870 次点击
    这是一个创建于 125 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    24 回复  |  直到 2019-08-04 15:55:10 +08:00
        1
    wangsongyan   125 天前 via iPhone
    那就是个普通文件,没问题啊
        2
    niuoh   125 天前 via Android
    换个思路 在执行过程中 把 sqllite 从远程下载到某个目录并加载
        3
    keepeye   125 天前
    把整个二进制文件转成 16 进制字符串嵌到你的代码里,运行的时候写到一个临时文件里 然后 sqlite 加载
        4
    Rheinmetal   125 天前
    都在代码里面了 不用再临时文件了吧 直接读内存咯
        5
    TangMonk   125 天前 via iPhone
    @Rheinmetal 怎么搞,求代码
        6
    TangMonk   125 天前 via iPhone
    @keepeye 用 base64 也可以
        7
    TangMonk   125 天前
    @niuoh #2 文件有点大,而且没有服务器
        8
    TangMonk   125 天前
    @wangsongyan #1 golang 的 sqlite 包只能用 Connection String 链接
        9
    Reficul   125 天前
    go-bin-data + go generate 在构建的时候打包进去就行
        10
    Reficul   125 天前
    go 的 sqlite 是 cgo binding,sqlite 本身是支持内存数据库的,只不过坊间传言好像锁会失效。

    另外如果用 Go 的 afero 这种虚拟文件系统,可能会因为 cgo 的原因,c 代码不能感知。
        11
    TangMonk   125 天前
    @Reficul #9 内存数据库也得要通过 Connection String 来链接,我只有把 sqlite 文件打包进可执行程序,然后程序解压放到临时目录然后再读取了。
        12
    TangMonk   125 天前
    @Reficul #10 Go 的 afero 好像是一个跨平台的文件管理的包吧
        13
    rrfeng   125 天前 via Android
    那还用啥 SQLite ??
        14
    TangMonk   125 天前
    @rrfeng #13 那用啥?
        15
    SuperMild   125 天前
    如果文件比较大,那么不管采用什么方法,都只能要么每次启动时全部读进内存,要么每次启动时写临时文件。感觉还不如在第一次启动时检查与程序相同目录下有没有 sqlite 数据库文件,没有就生成一个,以后直接使用。
        16
    AlvaIM   125 天前
    3 楼正解,理论上是可行的,但是有什么必要呢?
        17
    reus   125 天前
    何必,和程序一起发布不就行了
        18
    wangsongyan   125 天前
    @TangMonk 换个思路,你直接把 sql 打进可执行文件,启动的时候创建一个内存数据库,再把数据写进去
        19
    ksedz   125 天前   ♥ 1
    感觉这个可以满足要求
    https://github.com/rakyll/statik
        20
    rrfeng   125 天前
    @TangMonk
    你用 sqlite 不是还要用 gosql 去操作,写个对应表结构的 struct
    那为啥不直接写好 struct 然后代码里用 const 写一遍就行了呗。就是这个代码文件会很长,但是可以自动生成啊
        21
    TangMonk   124 天前
    @rrfeng #20 明白,这样也行。
        22
    TangMonk   124 天前
    @ksedz #19 这个还是不行,没法用 go-sqlite3 访问 sqlite 的文件
        24
    ysc3839   124 天前 via Android
    SQLite 有 VFS 的功能 https://www.sqlite.org/vfs.html
    大概可以自己实现一个内存 VFS。
    不考虑 Windows 的话大概还可以用 open_memstream https://linux.die.net/man/3/open_memstream
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1210 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 17:58 · PVG 01:58 · LAX 09:58 · JFK 12:58
    ♥ Do have faith in what you're doing.