Golang Go语言中发现个pure go的sqlite驱动

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中发现个pure go的sqlite驱动

源于 tg 群群友的推荐

文档: https://pkg.go.dev/modernc.org/sqlite 而且还有相应的 gorm 的驱动:https://github.com/cloudquery/sqlite

这样似乎用不到 cgo 了,而且 goreleaser 什么的好像都能跑

有没有人用过这个库,性能什么的差别大吗?如果不错的话感觉挺香的


更多关于Golang Go语言中发现个pure go的sqlite驱动的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

24 回复

cgo 对于交叉编译一点都不友好

更多关于Golang Go语言中发现个pure go的sqlite驱动的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 深有感触,搞分发的时候人都麻了

不仅如此,反而很多开发者引以为乐。觉得这样挺好的。

我有一个项目,用了 cgo 版本的 sqlite,CGO 是 ENABLE=1,在 docker 环境下的 alpine 上跑不起来。

用 file 命令查看可执行文件,发现是动态链接,很多 alpine 的动态链接库不兼容,最后需要改为静态链接。

最后加上 -linkmode “external” -extldflags “-static” 的 ldflag 参数才搞定。

希望能发展壮大 讨厌 cgo

大佬可以试试这个,我前几天试了下这个,但没有详细测试。这个库的大佬挺厉害,搞了一个 gcc 到 go 的编译器,然后把 sqlite 的 c 源码,编译成了 go 。

https://gitlab.com/cznic/ccgo/-/blob/master/v3/main.go

<br>//TODO parallel<br><br>//TODO CPython<br>//TODO Cython<br>//TODO gmp<br>//TODO gofrontend<br>//TODO gsl<br>//TODO gtk<br>//TODO hdf5<br>//TODO minigmp<br>//TODO mpc<br>//TODO mpfr<br>//TODO pcre<br>//TODO pcre2<br>//TODO quickjs<br>//TODO redis<br>//TODO tcl/tk<br>//TODO wolfssl<br>//TODO zdat<br>//TODO zlib<br>

附一下如何在开启 CGO_ENABLE 的条件下,让编译产物静态链接的文章:

https://johng.cn/cgo-enabled-affect-go-static-compile/

上面有口误,是“c 到 go”的编译器

挺好, 之前有个项目用到 sqlite, mac 上不能运行, 不能编译, 没办法把源码拷到服务器上编译

貌似 https://pkg.go.dev/modernc.org/sqlite 是用 exec 执行实现的?

这个作者挺厉害的,不过他很多项目实验性比较强,我是不敢用

你们抱怨的 cgo 问题,换了 c/c++一样会遇到,和 cgo 就没啥关系,
而且你以为你静态链接了所有依赖,其实没有,不信可以试试gethostbyname

至少这个库,我觉得交叉编译很友好呀

GOOS=linux GOARCH=arm64 go build -x -trimpath -a -ldflags ‘-extldflags “-static -fpic -s -w”’ .

环境是
archlinux 5.13.10-arch1-1 linux/amd64 x86_64
go version go1.17

#16 我发的这个?这个纯 go 搞的交叉编译当然舒服

当然不是你发这个

#18 https://github.com/mattn/go-sqlite3 这个?这个交叉编译可以这么方便的吗。。我孤陋寡闻了

#19 https://github.com/mattn/go-sqlite3 就是这个,用这个了蛮久了,如果不用一些扩展的话,交叉编译很方便,下载完对应的 gcc 就能用了。

这个很奇怪,我这里用静态编译指令过后,在 Centos7 上面跑一段时间会莫名其妙报空指针错误然后挂掉,不静态就不出问题,不太了解是什么原因。

笑嘻了 cloudquery archive 了

#22 没太懂笑点在哪。fork 更新一下版本继续用呗 https://github.com/iyear/sqlite

针对您提到的“pure go的sqlite驱动”,这是一个非常有价值的话题,特别是在Go语言社区中。以下是我的专业回复:

在Go语言生态系统中,拥有一个纯Go实现的SQLite驱动无疑是一个巨大的优势。这意味着该驱动不依赖于任何C语言库或其他外部依赖,从而提高了跨平台兼容性和部署的便利性。

纯Go的SQLite驱动通常具有以下几个优点:

  1. 跨平台兼容性:由于不依赖C语言库,该驱动可以在任何支持Go语言的环境中运行,包括Windows、Linux和macOS等。

  2. 易于集成:纯Go实现使得该驱动更容易与Go项目集成,无需处理复杂的编译和链接问题。

  3. 性能优化:虽然纯Go实现可能在某些方面不如C语言库高效,但Go语言的并发特性和垃圾回收机制使得开发者可以更容易地优化性能。

  4. 社区支持:作为一个纯Go项目,该驱动更有可能获得Go语言社区的支持和贡献,从而持续得到更新和维护。

在选择和使用纯Go的SQLite驱动时,建议您查看其文档和示例代码,以确保它满足您的项目需求。此外,还可以考虑其性能、稳定性和社区活跃度等因素。

总之,纯Go的SQLite驱动为Go语言开发者提供了一个强大且灵活的数据库访问解决方案,值得在项目中尝试和使用。

回到顶部