3 ms·
This project seems rather in need of a summary of what it is and what it does. How does it compare to for ex Sqlite?
by ufmace 5y ago
This project seems rather in need of a summary of what it is and what it does. How does it compare to for ex Sqlite?
- eatonphil 5y agoWell for one, if it's in Go, it wouldn't need Cgo.
- anderspitman 5y agoIt's pretty easy to statically link SQLite[0]. Are there other disadvantages to CGO? [0]: https://www.arp242.net/static-go.html https://www.arp242.net/static-go.html
- christophilus 5y agoYes. It doesn’t play nice with goroutines and Go’s concurrency model, from what I understand.
- eloff 5y agoYes, function calls across the boundary are slow. It's fine if the functions do lots of work, it's very expensive for function calls that should be cheap. For sqlite it might not matter too much, since any query does quite a bit of work.
- throwaway894345 5y agoAgreed. I wouldn't be surprised if a pure-Go alternative would be slower. Someone remarked upthread that the same author wrote a C-to-Go transpiler specifically to make a pure-Go sqlite and it was (somewhat unsurprisingly) considerably slower than the CGo version. It's possible (and to an extent, likely) that the transpolar was generating suboptimal Go code, but I would wager that a hand-written version would also be slower.
- azinman2 5y agoA query may do a lot of work but iterating over many results could be very slow.
- eloff 5y agoYes, the API is probably suboptimal for Go. It's better to make a wrapper that does the query and fetches many results in one call, into a Go buffer.
- vbitz 5y agoWithout additional configuration cgo breaks cross-compilation.
- anderspitman 5y agoOh right how could I forget that.
- bbss 5y agoThere are a few go libs now that offer SQLite without cgo. https://github.com/crawshaw/sqlite https://github.com/crawshaw/sqlite https://github.com/zombiezen/go-sqlite https://github.com/zombiezen/go-sqlite
- benhoyt 5y agocrawshaw/sqlite actually uses CGo -- it's a wrapper around the C version of SQLite. For example, see https://github.com/crawshaw/sqlite/blob/23d646f8ac00d9dd239003c121ca4fad16e2445f/sqlite.go#L63 https://github.com/crawshaw/sqlite/blob/23d646f8ac00d9dd2390... zombiezen/go-sqlite uses cznic's pure Go converted version of SQLite, so avoids CGo. It's explicitly stated to be "a fork of crawshaw.io/sqlite that uses modernc.org/sqlite, a CGo-free SQLite package. It aims to be a mostly drop-in replacement for crawshaw.io/sqlite."
- bbss 5y agoAh yes my bad
- qaq 5y agoThere is pure go port of SQLite
- benhoyt 5y agoThe same author ("cznic") has also built a C-to-Go compiler/transpiler and used it to convert SQLite to pure Go source, so that it doesn't require CGo: https://gitlab.com/cznic/sqlite https://gitlab.com/cznic/sqlite ... the converted Go code is pretty much unreadable and it's somewhat slower than SQLite via CGo. But a pretty neat idea! I use it in one of my projects and it works well.
- eatonphil 5y agoI saw that recently. I would be interested in using it but it wasn't clear what level of compatibility it has or how many tests it's passing/not passing.
- benhoyt 5y agoYeah, fair concern. I saw a while back (looks like Aug 2020) that he got all 928,000 SQLite tests passing -- search for "0 errors out of" on this page: https://pkg.go.dev/modernc.org/sqlite#section-readme https://pkg.go.dev/modernc.org/sqlite#section-readme
- eatonphil 5y agoWow! I'd almost trust it more if only 99% of tests were passing rather than 100% of tests passing. :)
- mongol 5y ago
- throwaway894345 5y agoNot sure why this is downvoted. SQLite is great and all, but not depending on FFI is really nice for a lot of things (e.g., cross-compiling is a lot simpler). I'll trade quite a bit to avoid even the very highest quality C dependencies.