SQLファーストゴング


BANはPostgreSQL、MySQL/MariADB、MSSQL、SQLiteのSQL-first Golang ORMです.
SQLでは、たとえば、次のBeanクエリで、SQLクエリをGOに書き込むことができます.
var num int
err := db.NewSelect().
    TableExpr("generate_series(1, 3)").
    Where("generate_series = ?", 3).
    Limit(10).
    Scan(ctx, &num)
次のSQLを生成します
SELECT *
FROM generate_series(1, 3)
WHERE generate_series = 123
LIMIT 10
SQLはまだそこにありますが、Binは? placeholdersにSQL注射のおかげで保護しながら長いクエリを生成するのに役立ちます.
Where("id = ?", 123)     // WHERE id = 123
Where("id >= ?", 123)    // WHERE id >= 123
Where("id = ?", "hello") // WHERE id = 'hello'

Where("id IN (?)", bun.In([]int{1, 2, 3})) // WHERE id IN (1, 2, 3)

Where("? = ?", bun.Ident("column"), "value") // WHERE "column" = 'value'
Beanを使用すると、次のBeanクエリなど、本当に複雑なクエリを書くことができます.
regionalSales := db.NewSelect().
    ColumnExpr("region").
    ColumnExpr("SUM(amount) AS total_sales").
    TableExpr("orders").
    GroupExpr("region")

topRegions := db.NewSelect().
    ColumnExpr("region").
    TableExpr("regional_sales").
    Where("total_sales > (SELECT SUM(total_sales) / 10 FROM regional_sales)")

var []items map[string]interface{}

err := db.NewSelect().
    With("regional_sales", regionalSales).
    With("top_regions", topRegions).
    ColumnExpr("region").
    ColumnExpr("product").
    ColumnExpr("SUM(quantity) AS product_units").
    ColumnExpr("SUM(amount) AS product_sales").
    TableExpr("orders").
    Where("region IN (SELECT region FROM top_regions)").
    GroupExpr("region").
    GroupExpr("product").
    Scan(ctx, &items)
次のSQLを生成します
WITH regional_sales AS (
    SELECT region, SUM(amount) AS total_sales
    FROM orders
    GROUP BY region
), top_regions AS (
    SELECT region
    FROM regional_sales
    WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product

構造とテーブル


Beanを使用すると、構造体を使用してデータベース構造体にGo構造体をマップすることができます.
type Model struct {
    ID        int64 `bun:",pk,autoincrement"`
    Name      string `bun:",notnull"`
    CreatedAt time.Time `bun:",nullzero,default:now()"`
}

err := db.ResetModel(ctx, &Model{})
次の表を生成します
CREATE TABLE "models" (
  "id" BIGSERIAL NOT NULL,
  "name" VARCHAR NOT NULL,
  "created_at" TIMESTAMPTZ DEFAULT now(),
  PRIMARY KEY ("id"),
)
次に、Go structを使用して行を選択/挿入/更新/削除できます.
model := new(Model)
err := db.NewSelect().Model().Where("id = ?", 123).Scan(ctx)

model.ID = 0
res, err := db.NewInsert().Model(model).Exec(ctx)

res, err := db.NewUpdate().
    Model(model).
    Set("name = ?", "updated name").
    WherePK().
    Exec(ctx)

res, err := db.NewDelete().Model(model).WherePK().Exec(ctx)
詳細はmodelsを参照してください.

BANドキュメント ゴランオルム


それで、 パートについてはどうですか?たとえば、Bang構造体を使用して一般的なテーブル関係を定義することができます.例えば、Author関係に属するBookを定義する方法を示します.
type Book struct {
    ID       int64
    AuthorID int64
    Author   Author `bun:"rel:belongs-to,join:author_id=id"`
}

type Author struct {
    ID int64
}
次に、Relationメソッドを使用してテーブルに参加します.
err := db.NewSelect().
    Model(book).
    Relation("Author").
    Where("id = ?", 123).
    Scan(ctx)
SELECT
  "book"."id", "book"."title", "book"."text",
  "author"."id" AS "author__id", "author"."name" AS "author__name"
FROM "books"
LEFT JOIN "users" AS "author" ON "author"."id" = "book"."author_id"
WHERE id = 1
詳細はGolang ORMを参照してください.

ORM:テーブル関係 データベースへの接続


BONデータベース/SQLの上で動作し、PostgreSQL、MySQL/MariADB、MSSQL、およびSQLiteをサポートしています.
データベースに接続するには、次の手順に従います.
import (
    "github.com/uptrace/bun"
    "github.com/uptrace/bun/dialect/pgdialect"
    "github.com/uptrace/bun/driver/pgdriver"
)

dsn := "postgres://postgres:@localhost:5432/test?sslmode=disable"
sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn)))

db := bun.NewDB(sqldb, pgdialect.New())
PostgreSQLデータベースに接続するには、次の手順に従います.
import (
    "github.com/uptrace/bun"
    "github.com/uptrace/bun/dialect/mysqldialect"
    _ "github.com/go-sql-driver/mysql"
)

sqldb, err := sql.Open("mysql", "root:pass@/test")
if err != nil {
    panic(err)
}

db := bun.NewDB(sqldb, mysqldialect.New())
すべての実行クエリをログ出力するには、MySQLをインストールできます.
import "github.com/uptrace/bun/extra/bundebug"

db.AddQueryHook(bundebug.NewQueryHook(
    bundebug.WithVerbose(true), // log everything
))

BenDebugプラグイン クエリの実行


があれば、クエリを実行し始めることができます.
// Select a user by a primary key.
user := new(User)
err := db.NewSelect().Model(user).Where("id = ?", 1).Scan(ctx)

// Select first 10 users.
var users []User
err := db.NewSelect().Model(&users).OrderExpr("id ASC").Limit(10).Scan(ctx)
modelのクエリ結果に関して、BUNは非常に柔軟で、構造体へのスキャンを可能にします.
user := new(User)
err := db.NewSelect().Model(user).Limit(1).Scan(ctx)
スカラに
var id int64
var name string
err := db.NewSelect().Model((*User)(nil)).Column("id", "name").Limit(1).Scan(ctx, &id, &name)
map[string]interface{}に.
var m map[string]interface{}
err := db.NewSelect().Model((*User)(nil)).Limit(1).Scan(ctx, &m)
そして上記の型のスライスには:
var users []User
err := db.NewSelect().Model(&users).Limit(1).Scan(ctx)

var ids []int64
var names []string
err := db.NewSelect().Model((*User)(nil)).Column("id", "name").Limit(1).Scan(ctx, &ids, &names)

var ms []map[string]interface{}
err := db.NewSelect().Model((*User)(nil)).Scan(ctx, &ms)
また、INSERT/UPDATE/DELETEクエリから結果を返すこともできます.
var ids []int64
res, err := db.NewDelete().Model((*User)(nil)).Returning("id").Exec(ctx, &ids)

走査 次は何ですか。


開始するには、 を参照し、documentationを実行します.
BANは、examplesOpenTelemetryを可能にするdistributed tracingの計装を含む多くのプラグインで来ます.
追跡を使用して、あなたはOpentElementalで働くmetricsのうちの1つを使用して、monitor performanceを缶詰にします.多くのopen source tracing toolsもOpenTelemrationをサポートしています.
また、DataDog competitorsexport metrics to Prometheusを使用してそれらを視覚化できます.