為什麼我們需要一個新的 ORM?
實際上有一些不錯的 ORM 可用,但它們只是不能滿足我的需求。那我想要什麼?
目前我還不能說企業在我提到的所有事情上都做得很好。但它的目的就是這樣做。
那麼讓我們看看企業是做什麼的。
高效能
您可以在此處查看基準測試原始程式碼。
https://github.com/MrSametBurgazoglu/go-orm-Benchmarks/tree/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中文網其他相關文章!