ホームページ > バックエンド開発 > Golang > Golang 用の新しい PostgreSQL ORM: Enterprise

Golang 用の新しい PostgreSQL ORM: Enterprise

Linda Hamilton
リリース: 2024-12-21 08:48:10
オリジナル
522 人が閲覧しました

新しい ORM が必要な理由

実際には、利用可能な優れた ORM がいくつかありますが、それらは私のニーズを満たしていませんでした。それで、私は何がしたかったのですか?

  • 高性能
  • コードとしてのスキーマ
  • 静的に型付けされ生成された API コード
  • 生成されるファイルの量が少ない
  • シンプルかつ機能的
  • RawSQL の簡単な使用法
  • 結合関係時のシングル データベース ヒット フィルター

現時点では、企業が私が述べたすべてのことをうまくやっているとは言えません。しかし、それはそうすることを目的としています。

それでは、企業が何をしているのか見てみましょう。

高性能

ベンチマークのソース コードはここでご覧いただけます。
https://github.com/MrSametBurgazoglu/go-orm-b​​enchmarks/tree/enterprise

New PostgreSQL ORM for Golang: Enterprise

ご覧のとおり、エンタープライズは非常に優れたパフォーマンスを発揮しています。

コードとしてのスキーマ

他の多くの企業と同様に、企業はコードから DB モデルを生成します。
ここに小さな例があります

// 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 という名前の各テーブルに 2 つのファイルが配置されます。そして、db を使用するための client.go があります。

静的に型付けされ生成された 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 つのファイルと、それらすべてを使用する 1 つのクライアント ファイルを生成します。ほとんどのケースを独自のパッケージで処理するため、よりクリーンな構造が得られます。

シンプルかつ機能的

Enterprise は、DB フィールドとのシンプルかつ機能的な対話を目指しています。このため、フィールドにはヘルパー関数があります。

テーブルに face_id という名前の nillable 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 を他と区別する最も重要な機能の 1 つは、リレーションを結合し、単一のクエリでフィルタリングできることです。

一例としてはこんな感じです。テストのスコアが 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: Enterpriseの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート