package main import ( "database/sql" "database/sql/driver" "encoding/json" "errors" "log" "os" _ "acudego" ) type Tag struct { Name string `json:"name"` Place string `json:"place"` } func (t *Tag) Scan(value interface{}) error { return json.Unmarshal([]byte(value.(string)), t) } func (t *Tag) Value() (driver.Value, error) { b, err := json.Marshal(t) return string(b), err } func main() { os.Remove("json.db") defer os.Remove("json.db") db, err := sql.Open("acudego", "json.db") if err != nil { log.Fatal(err) } defer db.Close() _, err = db.Exec(`create table myjsontable (tag jsonb)`) if err != nil { log.Fatal(err) } stmt, err := db.Prepare("insert into myjsontable(tag) values(?)") if err != nil { log.Fatal(err) } defer stmt.Close() _, err = stmt.Exec(`{"name": "name1", "place": "right-here"}`) if err != nil { log.Fatal(err) } _, err = stmt.Exec(`{"name": "michael", "place": "usa"}`) if err != nil { log.Fatal(err) } var place string err = db.QueryRow("select tag->>'place' from myjsontable where tag->>'name' = 'name1'").Scan(&place) if err != nil { log.Fatal(err) } if place != "right-here" { log.Fatal(errors.New("expected right-here, got: " + place)) } var tag Tag err = db.QueryRow("select tag from myjsontable where tag->>'name' = 'name1'").Scan(&tag) if err != nil { log.Fatal(err) } if tag.Name != "name1" { log.Fatal(errors.New("expected name1, got: " + tag.Name)) } if tag.Place != "right-here" { log.Fatal(errors.New("expected right-here, got: " + tag.Place)) } tag.Place = "日本" _, err = db.Exec(`update myjsontable set tag = ? where tag->>'name' == 'name1'`, &tag) if err != nil { log.Fatal(err) } err = db.QueryRow("select tag->>'place' from myjsontable where tag->>'name' = 'name1'").Scan(&place) if err != nil { log.Fatal(err) } if place != "日本" { log.Fatal(errors.New("expected 日本, got: " + place)) } }