我尝试使用go-bindata和packr,但是这些软件包没有显示如何将SQLite数据库文件打包为二进制文件。
我不需要以任何方式更新数据库,我只想在启动时从中读取数据。
如何将SQLite数据库文件嵌入Go二进制文件中?
SQLite驱动程序无法从内存(例如,从字节片)读取数据库文件。但是您可以将数据写入临时文件,然后打开该文件:
//go:generate go run gen.go
package main
import (
"database/sql"
"fmt"
"io/ioutil"
"log"
"os"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Create temporary file for database.
tmpDB, err := ioutil.TempFile("", "db*.sqlite3")
if err != nil {
log.Fatal(err)
}
// Remove this file after on exit.
defer func() {
err := os.Remove(tmpDB.Name())
if err != nil {
log.Print(err)
}
}()
// Write database to file.
_, err = tmpDB.Write(sqlDB)
if err != nil {
log.Print(err)
}
err = tmpDB.Close()
if err != nil {
log.Print(err)
}
// Open DB.
db, err := sql.Open("sqlite3", tmpDB.Name()+"?mode=ro")
if err != nil {
log.Fatal(err)
}
// Make sure it's loaded correct.
rows, err := db.Query("select * from test")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var c string
err := rows.Scan(&c)
if err != nil {
log.Fatal(err)
}
fmt.Println(c)
}
}
您可以使用以下方式将数据库写入db.go
:
// +build generate
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"strings"
)
func main() {
// Read source database file.
d, err := ioutil.ReadFile("source.sqlite3")
if err != nil {
log.Fatal(err)
}
fp, err := os.Create("db.go")
if err != nil {
log.Fatal(err)
}
_, err = fmt.Fprintf(fp, "// Code generated by gen.go; DO NOT EDIT.\n\n"+
"package main\n\n"+
"var sqlDB = %s\n", asbyte(d))
if err != nil {
log.Fatal(err)
}
}
// Write any data as byte array.
func asbyte(s []byte) string {
var b strings.Builder
for i, c := range s {
if i%19 == 0 {
b.WriteString("\n\t\t")
}
b.WriteString(fmt.Sprintf("%#x, ", c))
}
return "[]byte{" + b.String() + "}"
}
如果愿意,也可以使用go-bindata或packr,但是我看不出有什么优势。
另一种方法是使用内存数据库,该数据库 可能 会更快,具体取决于您要执行的操作。
此方法无法访问磁盘,因此以较慢的启动时间为代价,查询它可能会快一点(请确保使用基准测试!)。
问题内容: 我对Go完全陌生,我试图读取一个二进制文件,一次读取一个字节或几个字节。该文档并没有多大帮助,我找不到任何教程或简单示例(顺便说一句,Google如何给他们的语言提供这样一个难以理解的名称?)。基本上,如何打开文件,然后将一些字节读入缓冲区?有什么建议吗? 问题答案: 要处理文件,该软件包是您的朋友: 在过去的文件是如何打开更多的控制,看到代替(DOC) 。 为了读取文件,有很多方法。
我正在为Mac计算机创建一个JAVA桌面应用程序,使用jpack将所需的JRE捆绑到应用程序中,最后将. app发送给客户。 对于新的m1苹果arm硅计算机,我不想使用正确的JRE(intel)为每个处理器架构创建不同的应用程序 我试图创建两个。应用程序和使用mac命令行中的lipo工具,但这并不能真正起作用。 有什么建议吗?
问题内容: 我正尝试在电子应用程序中包含预编译的二进制文件。我从电子快速启动应用程序开始,然后修改了我的文件以包含以下代码,该代码在将文件放在身体上时触发: 我将预编译的 ffmpeg 二进制文件放入。一切在开发面板中都运行良好,但是当我使用electronic- packager设置应用程序时,在触发时会向控制台抛出a,但是似乎并没有得到明确的答案。electronic- packager上 的
问题内容: 在C语言中,我们可以构建二进制文件(目标文件和可执行文件)的调试版本或发行版本。我们如何在Go中做到这一点? 问题答案: 在Go中,通常没有调试版本或发行版本。 默认情况下,将符号和调试信息与二进制文件结合在一起。但是,您可以使用删除符号并调试信息。
问题内容: 我正在尝试将数据以二进制格式写入文件以进行压缩。数据完全由浮点组成,因此我决定将数据量化为0到65535之间的整数,以便可以将数据写入两位无符号整数并最终节省空间。但是,我需要将量化数据以二进制而不是人类可读的Ascii输出到文件中。 目前这就是我在做什么 @param outputFile包含已量化数据的文件作为.txt文件中的字符串 但是,这会以人类可读的字符串形式写入文件。我需要
问题内容: 我做了一个Java应用程序。并将所有类捆绑在jar文件中。.我从netbeans运行项目,我的应用程序运行成功..但是我将我的.jar文件放在另一个地方,然后从那里运行..我没有我的应用程序使用的图标..在代码中,我从项目文件夹中存在的images目录中获取我的图标。 现在,我想知道如何将这些图像文件呈现给最终用户(就像我们呈现.jar文件一样)。 问题答案: 似乎这里有两个问题: 在