Go使用GORM ORM套件連接PostgreSQL資料庫並查詢資料。
範例環境:
- MacBook Pro Apple M1
- masOS Monterey
- Go 1.19
- GORM 2.0 (gorm.io/gorm v1.24.2)
- PostgreSQL 14
事前要求
參考「Mac Homebrew安裝PostgreSQL」在本機安裝PostgreSQL資料庫。
參考「PostgreSQL 建立資料庫管理使用者」建立使用者admin。
參考「PostgreSQL 建立資料表」建立employee
資料表及資料。
安裝GORM
在Go專案根目錄以命令列執行go get -u gorm.io/gorm
下載GORM。
~/../go-demo% go get -u gorm.io/gorm
go: downloading gorm.io/gorm v1.24.2
go: downloading github.com/jinzhu/now v1.1.4
go: downloading github.com/jinzhu/now v1.1.5
...
安裝GORM PostgreSQL Driver
在Go專案根目錄以命令列執行go get -u gorm.io/driver/postgres
下載GORM存取PostgreSQL的driver。
~/../go-demo% go get -u gorm.io/driver/postgres
go: downloading gorm.io/driver/postgres v1.4.5
go: downloading github.com/jackc/pgx/v4 v4.17.2
go: downloading github.com/jackc/pgx v3.6.2+incompatible
go: downloading github.com/jackc/pgconn v1.13.0
go: downloading github.com/jackc/pgproto3/v2 v2.3.1
go: downloading golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa
go: downloading golang.org/x/crypto v0.3.0
...
範例
在Go程式匯入gorm.io/gorm
及gorm.io/driver/postgres
package。
建立與employee
資料表對應的ORM model struct Employee
及與欄位對應的屬性。
GORM預設以ID
對應資料表的primary key欄位。
GORM預設是以model名稱的複數(plural) snake_cases
名稱去對應資料表名稱,也就是説Employee
預設對應employees
而非employee
,而GORM可透過實作Tabler
介面的TableName
方法來設定model對應的資料表名稱或設定NamingStrategy.SingularTable
為true改用單數名稱。
Model屬性名稱則對應snake_case
欄位名稱,例如屬性CreatedAt
對應欄位created_at
(或使用column tag修改)。
呼叫postgres.Open
取得gorm.Dialector
傳入gorm.Open
取得gorm.DB
sessoin物件來進行資料庫操作。
呼叫gorm.DB.First
傳入Employee
的pointer變數取得employee
依主鍵id
排序的第一筆紀錄並將結果塞入model。
main.go
package main
import (
"fmt"
"time"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
type Employee struct {
ID int64 // primary key, column name is `id`"
Name string // column name is `name`"
Age int // column name is `age`"
CreatedAt time.Time // column name is `created_at`"
}
const (
HOST = "localhost"
PORT = "5432"
DATABASE = "postgres"
USER = "admin"
PASSWORD = "12345"
SSL = "disable"
)
func getGormDB() *gorm.DB {
dsn := fmt.Sprintf(
"host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
HOST, PORT, USER, PASSWORD, DATABASE, SSL)
gormDB, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // use singular table name, table for `User` would be `user` with this option enabled
},
})
if err != nil {
panic("open gorm db error")
}
return gormDB
}
func main() {
db := getGormDB()
emp := Employee{}
db.First(&emp) // SELECT * FROM employee ORDER BY id LIMIT 1;
fmt.Println(emp) // {1 john 33 2022-11-29 18:44:54.114161 +0000 UTC}
}
沒有留言:
張貼留言