Need help with pg?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

go-pg
4.9K Stars 358 Forks BSD 2-Clause "Simplified" License 2.2K Commits 99 Opened issues

Description

Golang ORM with focus on PostgreSQL features and performance

Services available

!
?

Need anything else?

Contributors list

Maintenance mode

go-pg is in a maintenance mode and only critical issues are addressed. New development happens in Bun repo which offers similar functionality but works with PostgreSQL, MySQL, MariaDB, and SQLite.

https://github.com/uptrace/bun




PostgreSQL client and ORM for Golang

Build Status PkgGoDev Documentation Chat

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.