Golang Go语言中有什么不依赖 cgo 的嵌入式 sql 数据库推荐吗?

Golang Go语言中有什么不依赖 cgo 的嵌入式 sql 数据库推荐吗?

如题,

sqlite 依赖于 cgo,不太方便交叉编译。

sqlite+dll 的方式只适合 windows,不适合 linux 。

kv 数据库有不少,但是功能上不如 sql 数据库齐全。

除此之外还有其他的选择吗?

储存少量数据需求,几千行数据。

22 回复

搜索 sqlite pure golang

更多关于Golang Go语言中有什么不依赖 cgo 的嵌入式 sql 数据库推荐吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


前些天从 sqlite 换到了 kv 数据库 bolt,目前没有发现不适。
https://github.com/etcd-io/bbolt

https://github.com/go-sqlite/sqlite3 “pure-Go sqlite3 file reader”

sqlite 是交叉编译最容易的 c 库了……

golang 的交叉编译太简单了,除非还有别的库。
sqlite 真的香。

#1 我搜索到的都是半成品,请问指的是?

#2 我也是打算用 kv,不过有的地方需要自己实现索引有点麻烦,所以看看是否有更好的选择。

#3 只读?

#4 但是维护各个平台下能够交叉编译到多环境挺麻烦。cgo 也碰到过多次奇怪的错误,想尽量避免 cgo 。

#5 目前比较方便的交叉编译方式是? xgo ?
的确 sqlite 省心。

#2

我原来测试过 github.com/boltdb/bolt
批量写入时,如果 key 不是顺序而是随机值,第一次写入速度会非常慢,100000 条需要 19s 。
刚刚试了下,etcd 也存在这个问题。

楼主找到了也告诉我一声,我只找到了 sqlite

#7 方便把测试代码发出来看下吗?这种单文件数据库,每次 update 操作都是存盘的,用 batch 方式,或者手动事务应该不至于这么低的性能。

#9

<br>package main<br><br>import (<br> "encoding/binary"<br> "fmt"<br> "log"<br> "math/rand"<br> "os"<br> "time"<br><br> "<a target="_blank" href="http://go.etcd.io/bbolt" rel="nofollow noopener">go.etcd.io/bbolt</a>"<br>)<br><br>func itob(v int) []byte {<br> b := make([]byte, 8)<br> binary.BigEndian.PutUint64(b, uint64(v))<br> return b<br>}<br><br>func main() {<br> test2()<br>}<br><br>// 测试随机批量连续<br>func test2() {<br> os.Remove("test2.db")<br> db, err := bbolt.Open("test2.db", 0600, nil)<br> if err != nil {<br> log.Fatal(err)<br> }<br> defer db.Close()<br><br> err = db.Update(func(tx *bbolt.Tx) error {<br> _, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))<br> return err<br> })<br> if err != nil {<br> panic(err)<br> }<br><br> buf := []byte("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")<br><br> data := make([]int, 100000)<br> for i, _ := range data {<br> data[i] = <a target="_blank" href="http://rand.Int" rel="nofollow noopener">rand.Int</a>()<br> }<br><br> for i := 0; i &lt; 20; i++ {<br> sTime := time.Now()<br> err = db.Update(func(tx *bbolt.Tx) error {<br> b := tx.Bucket([]byte("MyBucket"))<br> for _, v := range data {<br> err := b.Put(itob(v), buf)<br> if err != nil {<br> return err<br> }<br> }<br> return nil<br> })<br> /*<br> 乱序批量写 100000:15.2067849s<br> 乱序批量写 100000:409.6209ms<br> 乱序批量写 100000:421.3134ms<br> 乱序批量写 100000:381.5371ms<br> 乱序批量写 100000:381.5839ms<br> 乱序批量写 100000:361.8394ms<br> 乱序批量写 100000:362.8142ms<br> 乱序批量写 100000:364.7673ms<br> 乱序批量写 100000:359.8283ms<br> 乱序批量写 100000:376.0383ms<br> 乱序批量写 100000:361.9876ms<br> 乱序批量写 100000:362.0323ms<br> 乱序批量写 100000:374.0311ms<br> 乱序批量写 100000:365.0348ms<br> 乱序批量写 100000:360.0383ms<br> 乱序批量写 100000:361.022ms<br> 乱序批量写 100000:364.0195ms<br> 乱序批量写 100000:354.024ms<br> 乱序批量写 100000:370.0098ms<br> 乱序批量写 100000:379.9845ms<br> */<br> fmt.Println("乱序批量写 100000:", time.Now().Sub(sTime))<br> }<br>}<br><br>

#10 我用 Begin/Commit 试了下,第一次也是耗时很久。

楼主是否考虑带服务端的嵌入式数据库?

https://github.com/taosdata/TDengine

https://github.com/rqlite/rqlite

这两个的客户端都是纯 Go,就是需要额外启动一个服务端,但服务端的存储都是单文件,看起来没那么复杂。

还有一个

https://gitlab.com/cznic/ql

看到 2020 年还在更新。

推荐两个 K/V 库
https://github.com/xujiajun/nutsdb
https://github.com/prologic/bitcask
如果习惯写 sql 的话还是建议 sqlite,用 xgo 交叉编译就行了,参考: https://monkeywie.github.io/2019/10/10/go-cross-compile

#15 刚接触 Go. 所以想问问 为啥是推荐这 2 个数据库

而不是
badger - Fast key-value store in Go.
bbolt - An embedded key/value database for Go.

#17 key 不变, value 变化, 重复写, 数据库会变很大, 不会自动清理空间…

#17 我最后选了 badger, 然后自己看着 redis/ssdb 的 api 文档, 封装了一下

好吧,我之前看 badger K,V 都是[]byte 类型,就没太想用了🤣

#20 用 goframe 的 gconv 超级好用.

在Golang(Go语言)中,确实存在一些不依赖CGO的嵌入式SQL数据库,以下是一些推荐选项:

  1. Genji

    • 特点:Genji是一个功能强大的嵌入式SQL数据库,使用Go语言编写,不依赖于CGO。它基于GenjiDB,并为开发者提供了一个PostgreSQL兼容的SQL API,使得开发者可以轻松地使用已有的PostgreSQL代码。
    • 优势:支持将数据存储在磁盘上或内存中,为不同应用场景提供了灵活的存储选项。使用Pebble作为底层存储引擎,提供了高效的存储和查询性能。
    • 项目地址https://gitcode.com/gh_mirrors/ge/genji
  2. Go-SQLite3

    • 特点:Go-SQLite3是一个基于Wazero的SQLite绑定库,完全避免了CGO的使用。它提供了与database/sql兼容的驱动程序,并直接访问了大部分SQLite的C API。
    • 优势:轻量级、高效,适用于需要轻量级数据库的嵌入式设备,如物联网设备、移动应用等。支持多种扩展,如Bloom过滤器、UUID生成、JSON支持等,满足不同应用需求。

综上所述,Genji和Go-SQLite3都是适用于Go语言的不依赖CGO的嵌入式SQL数据库,开发者可以根据具体需求选择适合的数据库。

回到顶部