PostgreSQL ORM for Golang with focus on PostgreSQL features and performance
Go
Latest commit c0368cd Jul 19, 2018
Permalink
Failed to load latest commit information.
internal Cleanup pool Jun 5, 2018
orm Add Query.Exists() Jul 20, 2018
types types: fix time parsing Jun 26, 2018
.travis.yml Cleanup error handling Apr 1, 2018
CHANGELOG.md Update changelog Jun 27, 2018
LICENSE Use full name in license. Sep 12, 2016
Makefile Check for var shadowing Mar 28, 2018
README.md orm: add ForEach May 9, 2018
bench_test.go orm: add ForEach May 9, 2018
conv_test.go Add and fix 32bit build Mar 7, 2018
db.go Change DB.Param Jun 29, 2018
db_test.go Add Query.Exists() Jul 20, 2018
doc.go Move types.Result to orm.Result. Mar 11, 2017
error.go More docs Apr 29, 2018
example_array_test.go Check for var shadowing Mar 28, 2018
example_hstore_test.go Check for var shadowing Mar 28, 2018
example_many2many_self_test.go Better many to many example May 2, 2018
example_many2many_test.go More docs May 28, 2018
example_model_test.go Add Query.Exists() Jul 20, 2018
example_placeholders_test.go Check for var shadowing Mar 28, 2018
example_test.go Check for var shadowing Mar 28, 2018
exampledb_model_test.go readme: update example Mar 26, 2018
exampledb_query_test.go Move types.Result to orm.Result. Mar 11, 2017
export_test.go Add OnConnect hook Aug 25, 2017
hook.go Add QueryProcessedEvent.Attempt Oct 17, 2017
hook_test.go db.Close in tests Jan 19, 2018
listener.go listener: less noise Jun 5, 2018
listener_test.go Check for var shadowing Mar 28, 2018
loader_test.go Allow scanning returning data in DELETE queries Jun 21, 2017
main_test.go Move types.Result to orm.Result. Mar 11, 2017
messages.go Small cleanup Jun 5, 2018
options.go Accept postgresql as scheme. May 16, 2018
options_test.go Accept postgresql as scheme. May 16, 2018
pg.go Fix doc May 9, 2018
pool_test.go Cleanup pool Jun 5, 2018
race_test.go Cleanup pool Jun 5, 2018
result.go Improve ErrNoRows tests Jun 20, 2017
stmt.go Add sliceTableModel.AppendParam for bulk updates Mar 19, 2018
time.go orm: add Query.Value Feb 12, 2018
tx.go Add Tx.DB May 7, 2018
tx_test.go Move types.Result to orm.Result. Mar 11, 2017

README.md

PostgreSQL client and ORM for Golang

Build Status GoDoc

Features:

Get Started

go get -u github.com/go-pg/pg

Look & Feel

package pg_test

import (
    "fmt"

    "github.com/go-pg/pg"
    "github.com/go-pg/pg/orm"
)

type User struct {
    Id     int64
    Name   string
    Emails []string
}

func (u User) String() string {
    return fmt.Sprintf("User<%d %s %v>", u.Id, u.Name, u.Emails)
}

type Story struct {
    Id       int64
    Title    string
    AuthorId int64
    Author   *User
}

func (s Story) String() string {
    return fmt.Sprintf("Story<%d %s %s>", s.Id, s.Title, s.Author)
}

func ExampleDB_Model() {
    db := pg.Connect(&pg.Options{
        User: "postgres",
    })
    defer db.Close()

    err := createSchema(db)
    if err != nil {
        panic(err)
    }

    user1 := &User{
        Name:   "admin",
        Emails: []string{"admin1@admin", "admin2@admin"},
    }
    err = db.Insert(user1)
    if err != nil {
        panic(err)
    }

    err = db.Insert(&User{
        Name:   "root",
        Emails: []string{"root1@root", "root2@root"},
    })
    if err != nil {
        panic(err)
    }

    story1 := &Story{
        Title:    "Cool story",
        AuthorId: user1.Id,
    }
    err = db.Insert(story1)
    if err != nil {
        panic(err)
    }

    // Select user by primary key.
    user := &User{Id: user1.Id}
    err = db.Select(user)
    if err != nil {
        panic(err)
    }

    // Select all users.
    var users []User
    err = db.Model(&users).Select()
    if err != nil {
        panic(err)
    }

    // Select story and associated author in one query.
    story := new(Story)
    err = db.Model(story).
        Relation("Author").
        Where("story.id = ?", story1.Id).
        Select()
    if err != nil {
        panic(err)
    }

    fmt.Println(user)
    fmt.Println(users)
    fmt.Println(story)
    // Output: User<1 admin [admin1@admin admin2@admin]>
    // [User<1 admin [admin1@admin admin2@admin]> User<2 root [root1@root root2@root]>]
    // Story<1 Cool story User<1 admin [admin1@admin admin2@admin]>>
}

func createSchema(db *pg.DB) error {
    for _, model := range []interface{}{(*User)(nil), (*Story)(nil)} {
        err := db.CreateTable(model, &orm.CreateTableOptions{
            Temp: true,
        })
        if err != nil {
            return err
        }
    }
    return nil
}

See also