mirror of
https://github.com/status-im/status-go.git
synced 2025-02-27 06:00:48 +00:00
131 lines
3.2 KiB
Markdown
131 lines
3.2 KiB
Markdown
# SQL Datastore
|
|
|
|
[](https://circleci.com/gh/ipfs/go-ds-sql)
|
|
[](https://codecov.io/gh/ipfs/go-ds-sql)
|
|
[](https://github.com/RichardLitt/standard-readme)
|
|
[](https://godoc.org/github.com/ipfs/go-ds-sql)
|
|
[](https://golang.org/)
|
|
[](https://goreportcard.com/report/github.com/ipfs/go-ds-sql)
|
|
|
|
An implementation of [the datastore interface](https://github.com/ipfs/go-datastore)
|
|
that can be backed by any sql database.
|
|
|
|
## Install
|
|
|
|
```sh
|
|
go get github.com/ipfs/go-ds-sql
|
|
```
|
|
|
|
## Usage
|
|
|
|
### PostgreSQL
|
|
|
|
Ensure a database is created and a table exists with `key` and `data` columns. For example, in PostgreSQL you can create a table with the following structure (replacing `table_name` with the name of the table the datastore will use - by default this is `blocks`):
|
|
|
|
```sql
|
|
CREATE TABLE IF NOT EXISTS table_name (key TEXT NOT NULL UNIQUE, data BYTEA)
|
|
```
|
|
|
|
It's recommended to create an index on the `key` column that is optimised for prefix scans. For example, in PostgreSQL you can create a `text_pattern_ops` index on the table:
|
|
|
|
```sql
|
|
CREATE INDEX IF NOT EXISTS table_name_key_text_pattern_ops_idx ON table_name (key text_pattern_ops)
|
|
```
|
|
|
|
Import and use in your application:
|
|
|
|
```go
|
|
import (
|
|
"database/sql"
|
|
"github.com/ipfs/go-ds-sql"
|
|
pg "github.com/ipfs/go-ds-sql/postgres"
|
|
)
|
|
|
|
mydb, _ := sql.Open("yourdb", "yourdbparameters")
|
|
|
|
// Implement the Queries interface for your SQL impl.
|
|
// ...or use the provided PostgreSQL queries
|
|
queries := pg.NewQueries("blocks")
|
|
|
|
ds := sqlds.NewDatastore(mydb, queries)
|
|
```
|
|
|
|
### SQLite
|
|
|
|
The [SQLite](https://sqlite.org) wrapper tries to create the table automatically
|
|
|
|
Prefix scans are optimized by using GLOB
|
|
|
|
Import and use in your application:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
sqliteds "github.com/ipfs/go-ds-sql/sqlite"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
func main() {
|
|
opts := &sqliteds.Options{
|
|
DSN: "db.sqlite",
|
|
}
|
|
|
|
ds, err := opts.Create()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer func() {
|
|
if err := ds.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
}
|
|
```
|
|
|
|
If no `DSN` is specified, an unique in-memory database will be created
|
|
|
|
### SQLCipher
|
|
|
|
The SQLite wrapper also supports the [SQLCipher](https://www.zetetic.net/sqlcipher/) extension
|
|
|
|
Import and use in your application:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
sqliteds "github.com/ipfs/go-ds-sql/sqlite"
|
|
_ "github.com/mutecomm/go-sqlcipher/v4"
|
|
)
|
|
|
|
func main() {
|
|
opts := &sqliteds.Options{
|
|
DSN: "encdb.sqlite",
|
|
Key: ([]byte)("32_very_secure_bytes_0123456789a"),
|
|
}
|
|
|
|
ds, err := opts.Create()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer func() {
|
|
if err := ds.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
}
|
|
```
|
|
|
|
## API
|
|
|
|
[GoDoc Reference](https://godoc.org/github.com/ipfs/go-ds-sql)
|
|
|
|
## Contribute
|
|
|
|
Feel free to dive in! [Open an issue](https://github.com/ipfs/go-ds-sql/issues/new) or submit PRs.
|
|
|
|
## License
|
|
|
|
[MIT](LICENSE)
|