pg

by go-pg

go-pg / pg

Golang ORM with focus on PostgreSQL features and performance

4.1K Stars 305 Forks Last release: 26 days ago (v10.3.2) BSD 2-Clause "Simplified" License 2.1K Commits 345 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

PostgreSQL client and ORM for Golang

Build Status PkgGoDev Documentation Chat

:heart: Uptrace.dev - distributed traces, logs, and errors in one place

Ecosystem

Features

Installation

go-pg supports 2 last Go versions and requires a Go version with modules support. So make sure to initialize a Go module:

go mod init github.com/my/repo

And then install go-pg (note v10 in the import; omitting it is a popular mistake):

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

Quickstart

package pg_test

import ( "fmt"

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

)

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

func (u User) String() string { return fmt.Sprintf("User", u.Id, u.Name, u.Emails) }

type Story struct { Id int64 Title string AuthorId int64 Author *User pg:"rel:has-one" }

func (s Story) String() string { return fmt.Sprintf("Story", 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{"[email protected]", "[email protected]"},
}
_, err = db.Model(user1).Insert()
if err != nil {
    panic(err)
}

_, err = db.Model(&User{
    Name:   "root",
    Emails: []string{"[email protected]", "[email protected]"},
}).Insert()
if err != nil {
    panic(err)
}

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

// Select user by primary key.
user := &User{Id: user1.Id}
err = db.Model(user).WherePK().Select()
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 [[email protected] [email protected]]>
// [User<1 admin [[email protected] [email protected]]> User<2 root [[email protected] [email protected]]>]
// Story<1 Cool story User<1 admin [[email protected] [email protected]]>>

}

// createSchema creates database schema for User and Story models. func createSchema(db *pg.DB) error { models := []interface{}{ (*User)(nil), (*Story)(nil), }

for _, model := range models {
    err := db.Model(model).CreateTable(&orm.CreateTableOptions{
        Temp: true,
    })
    if err != nil {
        return err
    }
}
return nil

}

See also

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.