Golang Go语言中有什么不依赖 cgo 的嵌入式 sql 数据库推荐吗?
Golang Go语言中有什么不依赖 cgo 的嵌入式 sql 数据库推荐吗?
如题,
sqlite 依赖于 cgo,不太方便交叉编译。
sqlite+dll 的方式只适合 windows,不适合 linux 。
kv 数据库有不少,但是功能上不如 sql 数据库齐全。
除此之外还有其他的选择吗?
储存少量数据需求,几千行数据。
搜索 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 省心。
楼主找到了也告诉我一声,我只找到了 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 < 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数据库,以下是一些推荐选项:
-
Genji:
- 特点:Genji是一个功能强大的嵌入式SQL数据库,使用Go语言编写,不依赖于CGO。它基于GenjiDB,并为开发者提供了一个PostgreSQL兼容的SQL API,使得开发者可以轻松地使用已有的PostgreSQL代码。
- 优势:支持将数据存储在磁盘上或内存中,为不同应用场景提供了灵活的存储选项。使用Pebble作为底层存储引擎,提供了高效的存储和查询性能。
- 项目地址:https://gitcode.com/gh_mirrors/ge/genji
-
Go-SQLite3:
- 特点:Go-SQLite3是一个基于Wazero的SQLite绑定库,完全避免了CGO的使用。它提供了与database/sql兼容的驱动程序,并直接访问了大部分SQLite的C API。
- 优势:轻量级、高效,适用于需要轻量级数据库的嵌入式设备,如物联网设备、移动应用等。支持多种扩展,如Bloom过滤器、UUID生成、JSON支持等,满足不同应用需求。
综上所述,Genji和Go-SQLite3都是适用于Go语言的不依赖CGO的嵌入式SQL数据库,开发者可以根据具体需求选择适合的数据库。