package with import ( "context" "database/sql" ) type SQLKV struct { db *sql.DB } func KV(ctx context.Context, db *sql.DB, foo func(SQLKV) error) error { if _, err := db.ExecContext(ctx, ` CREATE TABLE IF NOT EXISTS with_kv( k TEXT PRIMARY KEY , v TEXT ) `); err != nil { return err } return foo(SQLKV{db: db}) } func (kv SQLKV) Get(ctx context.Context, k string) ([]byte, error) { row := kv.db.QueryRowContext(ctx, ` SELECT v FROM with_kv WHERE k=$1 `, k) var v []byte if err := row.Scan(&v); err != nil { return nil, err } return v, row.Err() } func (kv SQLKV) Set(ctx context.Context, k string, v []byte) error { _, err := kv.db.ExecContext(ctx, ` INSERT INTO with_kv (k, v) VALUES ($1, $2) ON CONFLICT DO UPDATE SET v=$2 WHERE k=$1 `, k, v) return err }