Skip to content

go-pg/pg

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Dec 14, 2024
bce00ad · Dec 14, 2024
Dec 14, 2024
Dec 14, 2024
Dec 14, 2024
Sep 30, 2024
Sep 5, 2020
Jan 5, 2023
Sep 14, 2020
Nov 8, 2023
Aug 15, 2020
Aug 15, 2020
Dec 14, 2024
Sep 12, 2016
Nov 20, 2021
Jan 17, 2024
Dec 14, 2024
Dec 14, 2024
Aug 24, 2021
Aug 25, 2021
Aug 15, 2020
Mar 20, 2024
May 31, 2020
Aug 12, 2022
Jul 15, 2020
Jul 15, 2020
Jul 15, 2020
Aug 24, 2021
Aug 24, 2021
Jul 15, 2020
Jul 15, 2020
Mar 26, 2021
Aug 24, 2021
Apr 28, 2020
Sep 19, 2020
Aug 24, 2021
Apr 28, 2020
Dec 14, 2024
Dec 14, 2024
Sep 14, 2020
Mar 20, 2024
Oct 8, 2022
Jul 15, 2020
Sep 5, 2020
Aug 24, 2021
Sep 4, 2021
Dec 14, 2024
Nov 8, 2023
Mar 26, 2021
Jun 18, 2020
Jul 15, 2020
Apr 28, 2020
Sep 6, 2020
Dec 14, 2024
May 21, 2021
Dec 14, 2024

Repository files navigation

PostgreSQL client and ORM for Golang

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.


Go PkgGoDev Documentation Chat

Tutorials

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<%d %s %v>", 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<%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.Model(user1).Insert()
    if err != nil {
        panic(err)
    }

    _, err = db.Model(&User{
        Name:   "root",
        Emails: []string{"root1@root", "root2@root"},
    }).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 [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]>>
}

// 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