AdSense

網頁

2022/11/29

Golang GORM PostgreSQL基本設定

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/gormgorm.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.DBsessoin物件來進行資料庫操作。

呼叫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}
}

github



沒有留言:

AdSense