栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Go二进制文件中捆绑SQLite数据库?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Go二进制文件中捆绑SQLite数据库?

SQLite驱动程序无法从内存(例如,从字节片)读取数据库文件。但是您可以将数据写入临时文件,然后打开该文件:

//go:generate go run gen.gopackage mainimport (    "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 generatepackage mainimport (    "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.nn"+        "package mainnn"+        "var sqlDB = %sn", 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("ntt")        }        b.WriteString(fmt.Sprintf("%#x, ", c))    }    return "[]byte{" + b.String() + "}"}

如果愿意,也可以使用go-bindata或packr,但是我看不出有什么优势。


另一种方法是使用内存数据库,该数据库 可能 会更快,具体取决于您要执行的操作。

  1. 将SQL模式和所需的行作为字符串嵌入到Go二进制文件中。
  2. 程序启动时(
    sql.Open("sqlite3",
    :memory:`),打开一个新的内存数据库,创建架构并插入行。

此方法无法访问磁盘,因此以较慢的启动时间为代价,查询它可能会快一点(请确保使用基准测试!)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/594956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号