Skip to main content

Go-PG

前置

初始化

数据库连接选项 pg.Options有如下字段:

  • Network: 网络类型,例如 "tcp","unix" 或 "udp"。如果为空,将默认使用 "tcp"。
  • Addr: 数据库服务器地址,如 "localhost:5432"。
  • Dialer: 自定义拨号器,如果你想对连接进行更精细的控制,可以使用此选项。
  • OnConnect: 每当创建新的数据库连接时,OnConnect 中的函数都会被调用。
  • User: 用于连接到数据库的用户名。
  • Password: 用于连接到数据库的密码。
  • Database: 要连接的数据库的名称。
  • ApplicationName: 应用程序的名称,这个名称将出现在 PostgreSQL 的日志和系统表中。
  • TLSConfig: 用于 TLS 连接的配置。如果为空,则不使用 TLS。
  • DialTimeout: 连接到数据库的超时时间。
  • ReadTimeout: 读操作的超时时间。
  • WriteTimeout: 写操作的超时时间。
  • MaxRetries: 连接失败后的最大重试次数。
  • RetryStatementTimeout: 是否在重试时使用语句超时。
  • MinRetryBackoff: 每次重试之间的最小退避时间。
  • MaxRetryBackoff: 每次重试之间的最大退避时间。
  • PoolSize: 连接池的大小,即同时保持的最大数据库连接数。
  • MinIdleConns: 池中最小的空闲连接数。
  • MaxConnAge: 连接可以保持打开的最长时间。
  • PoolTimeout: 如果所有连接都在使用中,那么获取新的数据库连接的最长等待时间。
  • IdleTimeout: 空闲连接在关闭前可以保持空闲的最长时间。
  • IdleCheckFrequency: 检查空闲连接的频率。

处理大量并发数据库操作,增加 PoolSize。 长时间保持数据库连接,增加 MaxConnAge。 数据库服务器使用 SSL,提供 TLSConfig

默认只需要四个值:

Addr:     "192.168.0.158:5432",
User: "user",
Password: "password",
Database: "dbname",

初始化示例:

package repository

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

var PG *pg.DB

func InitPostgresDB() {
// 1. 链接
PG = pg.Connect(&pg.Options{
Addr: "192.168.0.158:5432",
User: "root",
Password: "pass",
Database: "db",
})
}

类型

主键

type User struct {
Id int64 `pg:",pk"`
Name string
}

创建

插入

单行插入

book1 := &Book{ Title: "Example Book 1", Author: "Some Author", }

多行插入

book2 := &Book{ 
Title: "Example Book 2",
Author: "Another Author",
}
book3 := &Book{
Title: "Example Book 3",
Author: "Yet Another Author",
}
_, err = db.Model(book2, book3).Insert()
if err != nil { panic(err) }

查询

单行查询

query = 1
book := &Book{}
err := db.Model(book).Where("id = ?", query).Select()

全部查询

var books []Book
err := db.Model(&books).Select()

条件查询

book := &Book{}
err := db.Model(book).Where("id = ?", query).Select()
err := db.Model(book).Where("id = ?", query).Order("title asc").Select()

删除

单条删除

book := &Book{Id:"1"}
err := db.Model(book).WherePK().Delete()

删除表

import (
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
)

err := db.Model((*Book)(nil)).DropTable(&orm.DropTableOptions{
ifExits: true,
Cascade: true, // 级联删除所有依赖该表的对象
})

更新

单条更新:

book.Name = "new name"
_,err := db.Model(&book).WherePK().Update()
newBooks := []*Book[
{
Id: 123,
Name: "123123a"
},
{
Id: 1234,
Name: "123123a1"
}
]
result,err:= db.Model(&newBooks).Update()

删除单条数据

_, err = db.Model(&user).WherePK().Delete()
if err != nil {
panic(err)
}

删除全部

_, err = db.Model((*User)(nil)).Where("TRUE").Delete() 
if err != nil {
panic(err)
}

删除表

err := db.Model((*User)(nil)).DropTable(&orm.DropTableOptions{})
if err != nil {
panic(err)
}

删除数据库(需要超级用户权限)

_, err = db.Exec("DROP DATABASE new_database") 
if err != nil {
panic(err)
}