Skip to content
Daniel Cannon edited this page Jun 27, 2015 · 16 revisions
package main

import (
	"encoding/json"
	"fmt"

	r "github.com/dancannon/gorethink"
)

var session *r.Session

// Struct tags are used to map struct fields to fields in the database
type Person struct {
	Id    string `gorethink:"id,omitempty"`
	Name  string `gorethink:"name"`
	Place string `gorethink:"place"`
}

func init() {
	var err error
	session, err = r.Connect(r.ConnectOpts{
		Address:  "localhost:28015",
		Database: "test",
	})
	if err != nil {
		fmt.Println(err)
		return
	}
}

func main() {
	// Create a table
	createTable()

	// Insert a record
	id := insertRecord()

	if id != "" {
		// Update a record
		updateRecord(id)
	}

	// Fetch one
	fetchOneRecord()

	// Record count
	recordCount()

	// Fetch all
	fetchAllRecords()

	if id != "" {
		// Delete a record
		deleteRecord(id)
	}
}

func createTable() {
	result, err := r.DB("test").TableCreate("people").RunWrite(session)
	if err != nil {
		fmt.Println(err)
	}

	printStr("*** Create table result: ***")
	printObj(result)
	printStr("\n")
}

func insertRecord() string {
	var data = map[string]interface{}{
		"Name":  "David Davidson",
		"Place": "Somewhere",
	}

	result, err := r.Table("people").Insert(data).RunWrite(session)
	if err != nil {
		fmt.Println(err)
		return ""
	}

	printStr("*** Insert result: ***")
	printObj(result)
	printStr("\n")

	return result.GeneratedKeys[0]
}

func updateRecord(id string) {
	var data = map[string]interface{}{
		"Name":  "Steve Stevenson",
		"Place": "Anywhere",
	}

	result, err := r.Table("people").Get(id).Update(data).RunWrite(session)
	if err != nil {
		fmt.Println(err)
		return
	}

	printStr("*** Update result: ***")
	printObj(result)
	printStr("\n")
}

func fetchOneRecord() {
	cursor, err := r.Table("people").Run(session)
	if err != nil {
		fmt.Println(err)
		return
	}

	var person interface{}
	cursor.One(&person)
	cursor.Close()

	printStr("*** Fetch one record: ***")
	printObj(person)
	printStr("\n")
}

func recordCount() {
	cursor, err := r.Table("people").Count().Run(session)
	if err != nil {
		fmt.Println(err)
		return
	}

	var cnt int
	cursor.One(&cnt)
	cursor.Close()

	printStr("*** Count: ***")
	printObj(cnt)
	printStr("\n")
}

func fetchAllRecords() {
	rows, err := r.Table("people").Run(session)
	if err != nil {
		fmt.Println(err)
		return
	}

	// Read records into persons slice
	var persons []Person
	err2 := rows.All(&persons)
	if err2 != nil {
		fmt.Println(err2)
		return
	}

	printStr("*** Fetch all rows: ***")
	for _, p := range persons {
		printObj(p)
	}
	printStr("\n")
}

func deleteRecord(id string) {
	result, err := r.Table("people").Get(id).Delete().Run(session)
	if err != nil {
		fmt.Println(err)
		return
	}

	printStr("*** Delete result: ***")
	printObj(result)
	printStr("\n")
}

func printStr(v string) {
	fmt.Println(v)
}

func printObj(v interface{}) {
	vBytes, _ := json.Marshal(v)
	fmt.Println(string(vBytes))
}
Clone this wiki locally