SQLファーストゴング
BANはPostgreSQL、MySQL/MariADB、MSSQL、SQLiteのSQL-first Golang ORMです.
SQLでは、たとえば、次のBeanクエリで、SQLクエリをGOに書き込むことができます.
Beanを使用すると、構造体を使用してデータベース構造体にGo構造体をマップすることができます.
それで、 パートについてはどうですか?たとえば、Bang構造体を使用して一般的なテーブル関係を定義することができます.例えば、
BONデータベース/SQLの上で動作し、PostgreSQL、MySQL/MariADB、MSSQL、およびSQLiteをサポートしています.
データベースに接続するには、次の手順に従います.
があれば、クエリを実行し始めることができます.
開始するには、 を参照し、documentationを実行します.
BANは、examplesとOpenTelemetryを可能にするdistributed tracingの計装を含む多くのプラグインで来ます.
追跡を使用して、あなたはOpentElementalで働くmetricsのうちの1つを使用して、monitor performanceを缶詰にします.多くのopen source tracing toolsもOpenTelemrationをサポートしています.
また、DataDog competitorsとexport metrics to Prometheusを使用してそれらを視覚化できます.
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は、examplesとOpenTelemetryを可能にするdistributed tracingの計装を含む多くのプラグインで来ます.
追跡を使用して、あなたはOpentElementalで働くmetricsのうちの1つを使用して、monitor performanceを缶詰にします.多くのopen source tracing toolsもOpenTelemrationをサポートしています.
また、DataDog competitorsとexport metrics to Prometheusを使用してそれらを視覚化できます.
Reference
この問題について(SQLファーストゴング), 我々は、より多くの情報をここで見つけました https://dev.to/vmihailenco/bun-sql-first-golang-orm-2dpmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol