2023-05-22 15:40:36 +03:00
|
|
|
Bstore is a database library for storing and quering Go values.
|
2023-01-30 16:27:06 +03:00
|
|
|
|
2023-05-22 15:40:36 +03:00
|
|
|
Bstore is designed as a small, pure Go library that still provides most of
|
|
|
|
the common data consistency requirements for modest database use cases. Bstore
|
|
|
|
aims to make basic use of cgo-based libraries, such as sqlite, unnecessary.
|
|
|
|
|
|
|
|
See https://pkg.go.dev/github.com/mjl-/bstore for features, examples and full
|
|
|
|
documentation.
|
2023-01-30 16:27:06 +03:00
|
|
|
|
|
|
|
MIT-licensed
|
|
|
|
|
|
|
|
|
2023-05-22 15:40:36 +03:00
|
|
|
# FAQ - Frequently Asked Questions
|
|
|
|
|
|
|
|
## Is bstore an ORM?
|
|
|
|
|
|
|
|
No. The API for bstore may look like an ORM. But instead of mapping bstore
|
|
|
|
"queries" (function calls) to an SQL query string, bstore executes them
|
|
|
|
directly without converting to a query language, storing the data itself.
|
|
|
|
|
|
|
|
## How does bstore store its data?
|
|
|
|
|
|
|
|
A bstore database is a single-file BoltDB database. BoltDB provides ACID
|
|
|
|
properties. Bstore uses a BoltDB "bucket" (key/value store) for each Go type
|
|
|
|
stored, with multiple subbuckets: one for type definitions, one for the actual
|
|
|
|
data, and one bucket per index. BoltDB stores data in a B+tree. See format.md
|
|
|
|
for details.
|
|
|
|
|
|
|
|
## How does bstore compare to sqlite?
|
|
|
|
|
|
|
|
Sqlite is a great library, but Go applications that require cgo are hard to
|
2023-01-30 16:27:06 +03:00
|
|
|
cross-compile. With bstore, cross-compiling to most Go-supported platforms
|
2023-05-22 15:40:36 +03:00
|
|
|
stays trivial (though not plan9, unfortunately). Although bstore is much more
|
|
|
|
limited in so many aspects than sqlite, bstore also offers some advantages as
|
|
|
|
well. Some points of comparison:
|
2023-01-30 16:27:06 +03:00
|
|
|
|
|
|
|
- Cross-compilation and reproducibility: Trivial with bstore due to pure Go,
|
|
|
|
much harder with sqlite because of cgo.
|
2023-05-22 15:40:36 +03:00
|
|
|
- Code complexity: low with bstore (7k lines including comments/docs), high
|
2023-01-30 16:27:06 +03:00
|
|
|
with sqlite.
|
|
|
|
- Query language: mostly-type-checked function calls in bstore, free-form query
|
|
|
|
strings only checked at runtime with sqlite.
|
|
|
|
- Functionality: very limited with bstore, much more full-featured with sqlite.
|
|
|
|
- Schema management: mostly automatic based on Go type definitions in bstore,
|
|
|
|
manual with ALTER statements in sqlite.
|
|
|
|
- Types and packing/parsing: automatic/transparent in bstore based on Go types
|
|
|
|
(including maps, slices, structs and custom MarshalBinary encoding), versus
|
|
|
|
manual scanning and parameter passing with sqlite with limited set of SQL
|
|
|
|
types.
|
|
|
|
- Performance: low to good performance with bstore, high performance with
|
|
|
|
sqlite.
|
|
|
|
- Database files: single file with bstore, several files with sqlite (due to
|
|
|
|
WAL or journal files).
|
|
|
|
- Test coverage: decent coverage but limited real-world for bstore, versus
|
|
|
|
extremely thoroughly tested and with enormous real-world use.
|