首頁 >後端開發 >Golang >適用於 Golang 的新 PostgreSQL ORM:企業版

適用於 Golang 的新 PostgreSQL ORM:企業版

Linda Hamilton
Linda Hamilton原創
2024-12-21 08:48:10523瀏覽

為什麼我們需要一個新的 ORM?

實際上有一些不錯的 ORM 可用,但它們只是不能滿足我的需求。那我想要什麼?

  • 高效能
  • 架構即程式碼
  • 靜態輸入與產生的 API 程式碼
  • 產生的檔案較少
  • 簡單實用
  • 簡單的 RawSQL 使用
  • 連接關係時單一資料庫命中過濾器

目前我還不能說企業在我提到的所有事情上都做得很好。但它的目的就是這樣做。

那麼讓我們看看企業是做什麼的。

高效能

您可以在此處查看基準測試原始程式碼。
https://github.com/MrSametBurgazoglu/go-orm-Benchmarks/tree/enterprise

New PostgreSQL ORM for Golang: Enterprise

如您所見,企業的表現非常出色。

架構即程式碼

像許多其他企業一樣,企業從您的程式碼產生資料庫模型。
這是一個小例子

// db_models/account.go
package db_models

import (
    "github.com/MrSametBurgazoglu/enterprise/models"
    "github.com/google/uuid"
)

func Account() *models.Table {
    idField := models.UUIDField("ID").DefaultFunc(uuid.New)

    tb := &models.Table{
        Fields: []models.FieldI{
            idField,
            models.StringField("Name"),
            models.StringField("Surname"),
            models.UUIDField("TestID").SetNillable(),
        },
        Relations: []*models.Relation{
            models.ManyToOne(TestName, idField.DBName, "test_id"),
            models.ManyToMany(GroupName, "account_id", "group_id", "id", AccountGroupName),
        },
    }

    tb.SetTableName(AccountName)
    tb.SetIDField(idField)

    return tb
}
// generate/generate.go
package main

import (
    "example/db_models"
    "github.com/MrSametBurgazoglu/enterprise/generate"
)

func main() {
    generate.Models(
        db_models.Test(),
        db_models.Account(),
        db_models.Group(),
    )
}

當您執行上面的腳本時,它將建立一個名為 models 的套件,並為每個名為 model.go 和 model_predicates.go 的表放置兩個檔案。並且會有一個client.go用來使用db。

靜態輸入與產生的 API 程式碼

自動產生模型後,您可以建立並取得模型。

import "/your/project/models" // your auto-generated models package

func main() {
    db, err := models.NewDB(dbUrl)
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    account := models.NewAccount(ctx, db)
    account.SetName("name")
    account.SetSurname("surname")
    err = account.Create()//row added to table
    if err != nil {
        log.Fatal(err)
    }
}
import "/your/project/models" // your auto-generated models package

func main() {
    db, err := models.NewDB(dbUrl)
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    account := models.NewAccount(ctx, db)
    account.Where(account.IsIDEqual(uuid.New()))
    err = account.Get()//row variables set to account struct
    if err != nil {
        log.Fatal(err)
    }
}

產生較少的檔案

就像我之前說過的,企業為每個表產生 2 個文件,以及一個使用所有這些表的客戶端文件。它在自己的包中處理大多數情況,這樣您將擁有更乾淨的結構。

簡單實用

Enterprise 的目標是與資料庫欄位進行簡單且功能性的互動。為此,欄位具有輔助函數。

假設表上有一個名為face_id 的可為空的uuid,並以*uuid 表示它。 Enterprise 將產生一個輔助函數來用字串設定它。這樣你就不需要取得該變數的指標。

func (t *Account) SetFaceIDValue(v uuid.UUID)

如果你有一個 uuid 字段,它將建立一個解析器助理。

func (t *Account) ParseFaceID(v string) error

對於某些值類型,它將有 IN 子句。

func (t *Account) FaceIDIN(v ...uuid.UUID) bool
func (t *Account) FaceIDNotIN(v ...uuid.UUID) bool

對於 time.Time 它將建立這些輔助函數。

func (t *Account) FormatCreatedAt(v string) string
func (t *Account) ParseCreatedAt(layout, value string) error

簡單的 RawSQL 用法

企業可以建立複雜的查詢,但始終需要 RawSQL。因此,您可以使用 models.IDatabase 與 pgx 互動。如果需要,我們計劃將原始 sql 結果掃描到您的資料庫模型或您使用關係建立的自訂結構。

連接關係時單一資料庫命中過濾器

Enterprise 與其他產品的差異最重要的功能之一是可以透過單一查詢連接關係並過濾它們。

一個例子是這樣的。讓我們來看看學生答錯的測驗題,並且測驗分數高於 80。

// db_models/account.go
package db_models

import (
    "github.com/MrSametBurgazoglu/enterprise/models"
    "github.com/google/uuid"
)

func Account() *models.Table {
    idField := models.UUIDField("ID").DefaultFunc(uuid.New)

    tb := &models.Table{
        Fields: []models.FieldI{
            idField,
            models.StringField("Name"),
            models.StringField("Surname"),
            models.UUIDField("TestID").SetNillable(),
        },
        Relations: []*models.Relation{
            models.ManyToOne(TestName, idField.DBName, "test_id"),
            models.ManyToMany(GroupName, "account_id", "group_id", "id", AccountGroupName),
        },
    }

    tb.SetTableName(AccountName)
    tb.SetIDField(idField)

    return tb
}

儲存庫:https://github.com/MrSametBurgazoglu/enterprise
文件:https://mrsametburgazoglu.github.io/enterprise_docs/

以上是適用於 Golang 的新 PostgreSQL ORM:企業版的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn