第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何將 SQLite 數(shù)據(jù)庫(kù)捆綁到 Go 二進(jìn)制文件中?

如何將 SQLite 數(shù)據(jù)庫(kù)捆綁到 Go 二進(jìn)制文件中?

Go
蕪湖不蕪 2023-07-10 14:43:24
我嘗試使用 go-bindata 和 packr,但這些包沒有顯示如何將 SQLite 數(shù)據(jù)庫(kù)文件打包到二進(jìn)制文件中。我不需要以任何方式更新數(shù)據(jù)庫(kù),我只想在啟動(dòng)時(shí)從中讀取數(shù)據(jù)。如何將 SQLite 數(shù)據(jù)庫(kù)文件嵌入到 Go 二進(jìn)制文件中?
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

SQLite 驅(qū)動(dòng)程序無(wú)法從內(nèi)存(例如從字節(jié)片)讀取數(shù)據(jù)庫(kù)文件。但是您可以將數(shù)據(jù)寫入臨時(shí)文件,然后打開該文件:


//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您可以使用以下內(nèi)容寫入數(shù)據(jù)庫(kù):


// +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,但我并沒有真正看到優(yōu)勢(shì)。

另一種方法是使用內(nèi)存數(shù)據(jù)庫(kù),這可能會(huì)更快,具體取決于您想要執(zhí)行的操作。

  1. 將您想要的 SQL 架構(gòu)和行作為字符串嵌入到 Go 二進(jìn)制文件中。

  2. 當(dāng)程序啟動(dòng)時(shí)打開一個(gè)新的內(nèi)存數(shù)據(jù)庫(kù)(sql.Open("sqlite3",:memory:`)并創(chuàng)建模式并插入行。

此方法沒有磁盤訪問(wèn),因此查詢它可能會(huì)更快一點(diǎn),但代價(jià)是啟動(dòng)時(shí)間較慢(當(dāng)然是基準(zhǔn)?。?/p>



查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)