{"id":13416847,"url":"https://github.com/go-pg/pg","last_synced_at":"2025-05-13T21:02:31.265Z","repository":{"id":8211792,"uuid":"9646845","full_name":"go-pg/pg","owner":"go-pg","description":"Golang ORM with focus on PostgreSQL features and performance","archived":false,"fork":false,"pushed_at":"2025-04-16T21:50:20.000Z","size":3629,"stargazers_count":5718,"open_issues_count":120,"forks_count":411,"subscribers_count":84,"default_branch":"v10","last_synced_at":"2025-05-06T20:18:21.437Z","etag":null,"topics":["database","go","golang","hstore","jsonb","orm","postgresql","sql"],"latest_commit_sha":null,"homepage":"https://pg.uptrace.dev/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/go-pg.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":["https://uptrace.dev/sponsor"]}},"created_at":"2013-04-24T12:31:41.000Z","updated_at":"2025-05-05T08:38:47.000Z","dependencies_parsed_at":"2023-01-13T14:41:09.282Z","dependency_job_id":"eb767a98-cbff-4bc0-beab-ad68189969a6","html_url":"https://github.com/go-pg/pg","commit_stats":{"total_commits":1492,"total_committers":74,"mean_commits":20.16216216216216,"dds":"0.10991957104557637","last_synced_commit":"bce00adc25696cc87008ccc4daf10f6350bbdae8"},"previous_names":["vmihailenco/pg"],"tags_count":452,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-pg%2Fpg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-pg%2Fpg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-pg%2Fpg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-pg%2Fpg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/go-pg","download_url":"https://codeload.github.com/go-pg/pg/tar.gz/refs/heads/v10","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254027295,"owners_count":22002032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","go","golang","hstore","jsonb","orm","postgresql","sql"],"created_at":"2024-07-30T22:00:23.527Z","updated_at":"2025-05-13T21:02:31.210Z","avatar_url":"https://github.com/go-pg.png","language":"Go","readme":"# PostgreSQL client and ORM for Golang\n\n## Maintenance mode\n\ngo-pg is in a maintenance mode and only critical issues are addressed. New development happens in\n[**Bun**](https://bun.uptrace.dev/guide/pg-migration.html) repo which offers similar functionality\nbut works with PostgreSQL, MySQL, MariaDB, and SQLite.\n\n## [Golang ORM](https://github.com/uptrace/bun)\n\n---\n\n[![Go](https://github.com/go-pg/pg/actions/workflows/build.yml/badge.svg?branch=v10)](https://github.com/go-pg/pg/actions/workflows/build.yml)\n[![PkgGoDev](https://pkg.go.dev/badge/github.com/go-pg/pg/v10)](https://pkg.go.dev/github.com/go-pg/pg/v10)\n[![Documentation](https://img.shields.io/badge/pg-documentation-informational)](https://pg.uptrace.dev/)\n[![Chat](https://discordapp.com/api/guilds/752070105847955518/widget.png)](https://discord.gg/rWtp5Aj)\n\n- [Documentation](https://pg.uptrace.dev)\n- [Reference](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc)\n- [Examples](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#pkg-examples)\n- Example projects:\n  - [monetr](https://github.com/monetr/monetr) - budgeting application focused on planning for\n    recurring expenses\n  - [bunrouter](https://github.com/go-bun/bun-realworld-app)\n  - [gin](https://github.com/gogjango/gjango)\n  - [go-kit](https://github.com/Tsovak/rest-api-demo)\n  - [aah framework](https://github.com/kieusonlam/golamapi)\n\n## Tutorials\n\n- [GraphQL Tutorial on YouTube](https://www.youtube.com/playlist?list=PLzQWIQOqeUSNwXcneWYJHUREAIucJ5UZn).\n- [Modern API design with Golang, PostgreSQL and Docker](https://bognov.tech/modern-api-design-with-golang-postgresql-and-docker)\n\n## Ecosystem\n\n- Migrations by [vmihailenco](https://github.com/go-pg/migrations) and\n  [robinjoseph08](https://github.com/robinjoseph08/go-pg-migrations).\n- [Genna - cli tool for generating go-pg models](https://github.com/dizzyfool/genna).\n- [bigint](https://github.com/d-fal/bigint) - big.Int type for go-pg.\n- [urlstruct](https://github.com/go-pg/urlstruct) to decode `url.Values` into structs.\n- [Sharding](https://github.com/go-pg/sharding).\n- [go-pg-monitor](https://github.com/hypnoglow/go-pg-monitor) - Prometheus metrics based on go-pg\n  client stats.\n\n## Features\n\n- Basic types: integers, floats, string, bool, time.Time, net.IP, net.IPNet.\n- sql.NullBool, sql.NullString, sql.NullInt64, sql.NullFloat64 and\n  [pg.NullTime](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#NullTime).\n- [sql.Scanner](http://golang.org/pkg/database/sql/#Scanner) and\n  [sql/driver.Valuer](http://golang.org/pkg/database/sql/driver/#Valuer) interfaces.\n- Structs, maps and arrays are marshalled as JSON by default.\n- PostgreSQL multidimensional Arrays using\n  [array tag](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-Model-PostgresArrayStructTag)\n  and [Array wrapper](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-Array).\n- Hstore using\n  [hstore tag](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-Model-HstoreStructTag)\n  and [Hstore wrapper](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-Hstore).\n- [Composite types](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-Model-CompositeType).\n- All struct fields are nullable by default and zero values (empty string, 0, zero time, empty map\n  or slice, nil ptr) are marshalled as SQL `NULL`. `pg:\",notnull\"` is used to add SQL `NOT NULL`\n  constraint and `pg:\",use_zero\"` to allow Go zero values.\n- [Transactions](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-Begin).\n- [Prepared statements](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-Prepare).\n- [Notifications](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-Listener) using\n  `LISTEN` and `NOTIFY`.\n- [Copying data](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB-CopyFrom) using\n  `COPY FROM` and `COPY TO`.\n- [Timeouts](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#Options) and canceling queries using\n  context.Context.\n- Automatic connection pooling with\n  [circuit breaker](https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern) support.\n- Queries retry on network errors.\n- Working with models using\n  [ORM](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model) and\n  [SQL](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Query).\n- Scanning variables using\n  [ORM](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-SelectSomeColumnsIntoVars)\n  and [SQL](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-Scan).\n- [SelectOrInsert](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-InsertSelectOrInsert)\n  using on-conflict.\n- [INSERT ... ON CONFLICT DO UPDATE](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-InsertOnConflictDoUpdate)\n  using ORM.\n- Bulk/batch\n  [inserts](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-BulkInsert),\n  [updates](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-BulkUpdate), and\n  [deletes](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-BulkDelete).\n- Common table expressions using\n  [WITH](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-SelectWith) and\n  [WrapWith](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-SelectWrapWith).\n- [CountEstimate](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-CountEstimate)\n  using `EXPLAIN` to get\n  [estimated number of matching rows](https://wiki.postgresql.org/wiki/Count_estimate).\n- ORM supports\n  [has one](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-HasOne),\n  [belongs to](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-BelongsTo),\n  [has many](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-HasMany), and\n  [many to many](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-ManyToMany)\n  with composite/multi-column primary keys.\n- [Soft deletes](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-SoftDelete).\n- [Creating tables from structs](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-CreateTable).\n- [ForEach](https://pkg.go.dev/github.com/go-pg/pg/v10?tab=doc#example-DB.Model-ForEach) that calls\n  a function for each row returned by the query without loading all rows into the memory.\n\n## Installation\n\ngo-pg supports 2 last Go versions and requires a Go version with\n[modules](https://github.com/golang/go/wiki/Modules) support. So make sure to initialize a Go\nmodule:\n\n```shell\ngo mod init github.com/my/repo\n```\n\nAnd then install go-pg (note _v10_ in the import; omitting it is a popular mistake):\n\n```shell\ngo get github.com/go-pg/pg/v10\n```\n\n## Quickstart\n\n```go\npackage pg_test\n\nimport (\n    \"fmt\"\n\n    \"github.com/go-pg/pg/v10\"\n    \"github.com/go-pg/pg/v10/orm\"\n)\n\ntype User struct {\n    Id     int64\n    Name   string\n    Emails []string\n}\n\nfunc (u User) String() string {\n    return fmt.Sprintf(\"User\u003c%d %s %v\u003e\", u.Id, u.Name, u.Emails)\n}\n\ntype Story struct {\n    Id       int64\n    Title    string\n    AuthorId int64\n    Author   *User `pg:\"rel:has-one\"`\n}\n\nfunc (s Story) String() string {\n    return fmt.Sprintf(\"Story\u003c%d %s %s\u003e\", s.Id, s.Title, s.Author)\n}\n\nfunc ExampleDB_Model() {\n    db := pg.Connect(\u0026pg.Options{\n        User: \"postgres\",\n    })\n    defer db.Close()\n\n    err := createSchema(db)\n    if err != nil {\n        panic(err)\n    }\n\n    user1 := \u0026User{\n        Name:   \"admin\",\n        Emails: []string{\"admin1@admin\", \"admin2@admin\"},\n    }\n    _, err = db.Model(user1).Insert()\n    if err != nil {\n        panic(err)\n    }\n\n    _, err = db.Model(\u0026User{\n        Name:   \"root\",\n        Emails: []string{\"root1@root\", \"root2@root\"},\n    }).Insert()\n    if err != nil {\n        panic(err)\n    }\n\n    story1 := \u0026Story{\n        Title:    \"Cool story\",\n        AuthorId: user1.Id,\n    }\n    _, err = db.Model(story1).Insert()\n    if err != nil {\n        panic(err)\n    }\n\n    // Select user by primary key.\n    user := \u0026User{Id: user1.Id}\n    err = db.Model(user).WherePK().Select()\n    if err != nil {\n        panic(err)\n    }\n\n    // Select all users.\n    var users []User\n    err = db.Model(\u0026users).Select()\n    if err != nil {\n        panic(err)\n    }\n\n    // Select story and associated author in one query.\n    story := new(Story)\n    err = db.Model(story).\n        Relation(\"Author\").\n        Where(\"story.id = ?\", story1.Id).\n        Select()\n    if err != nil {\n        panic(err)\n    }\n\n    fmt.Println(user)\n    fmt.Println(users)\n    fmt.Println(story)\n    // Output: User\u003c1 admin [admin1@admin admin2@admin]\u003e\n    // [User\u003c1 admin [admin1@admin admin2@admin]\u003e User\u003c2 root [root1@root root2@root]\u003e]\n    // Story\u003c1 Cool story User\u003c1 admin [admin1@admin admin2@admin]\u003e\u003e\n}\n\n// createSchema creates database schema for User and Story models.\nfunc createSchema(db *pg.DB) error {\n    models := []interface{}{\n        (*User)(nil),\n        (*Story)(nil),\n    }\n\n    for _, model := range models {\n        err := db.Model(model).CreateTable(\u0026orm.CreateTableOptions{\n            Temp: true,\n        })\n        if err != nil {\n            return err\n        }\n    }\n    return nil\n}\n```\n\n## See also\n\n- [Golang PostgreSQL](https://bun.uptrace.dev/postgres/)\n- [Golang HTTP router](https://github.com/uptrace/bunrouter)\n- [Golang ClickHouse ORM](https://github.com/uptrace/go-clickhouse)\n- [Golang msgpack](https://github.com/vmihailenco/msgpack)\n- [Distributed tracing tools](https://get.uptrace.dev/compare/distributed-tracing-tools.html)\n","funding_links":["https://uptrace.dev/sponsor"],"categories":["Popular","Go","Misc","ORM","Backend Go","语言资源库","网络相关库","Relational Databases","\u003cspan id=\"orm\"\u003eORM\u003c/span\u003e"],"sub_categories":["Advanced Console UIs","HTTP Clients","ORM","go","OpenGL","交流","HTTP客户端","\u003cspan id=\"高级控制台用户界面-advanced-console-uis\"\u003e高级控制台用户界面 Advanced Console UIs\u003c/span\u003e"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgo-pg%2Fpg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgo-pg%2Fpg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgo-pg%2Fpg/lists"}