什么是 Bun?

Bun 是一个面向 SQL 的 Go 数据库客户端。面向 SQL 意味着大多数 SQL 查询可以自动编译为 Bun 表达式,而 Bun 表达式看起来和感觉起来都像 SQL 查询。

Bun 的目的是允许使用传统的 SQL 编写查询,并帮助将结果扫描到常见的 Go 类型中:结构体、映射、切片和标量。

工作原理

Bun 包装了 sql.DB 以提供查询 构建器钩子。原始的 sql.DB 可作为 db.DB 使用,并且可以不受任何限制地使用。

type DB struct {
	*sql.DB
    ...
}

Bun 附带了每个支持的数据库的 方言。Bun 使用方言在构建查询和扫描查询结果时发现可用功能。例如,要连接到 PostgreSQL 服务器,您应该使用 PostgreSQL 驱动程序(例如,pgdriver在新窗口中打开)和 PostgreSQL 方言(pgdialect)。

Bun 提供了 夹具 来加载初始数据和 迁移 来更新数据库模式。您还可以使用 Bun 入门套件 来快速使用这些包引导应用程序。

为什么需要另一个数据库客户端?

这样您就可以优雅地编写复杂的查询

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)")

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)
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

为什么不使用…?

GORM

使用 Bun 编写复杂的查询通常比使用 GORM在新窗口中打开 更容易。开箱即用,Bun 与数据库特定功能的集成更好,例如 PostgreSQL 数组。Bun 也更快,部分原因是 Bun 的体积和范围更小。

Bun 不支持 GORM 这样流行的功能,例如自动迁移(您可以尝试使用 夹具 代替)、优化器/索引/注释提示和数据库解析器。

Ent

使用 Bun,您可以使用您以前使用 SQL DBMS 和 Go 的经验来编写快速且惯用的代码。Bun 的目标是帮助您编写 SQL,而不是替换或隐藏它。

使用 Ent在新窗口中打开,您以前的经验并不意味着那么多,甚至可能具有误导性,因为 Ent 提供了一种新的/不同的方法来编写 Go 应用程序,您别无选择,只能遵循它。

go-pg

Bun 是 go-pg 的重写版本,它在 sql.DB 之上运行,而不是使用自定义 API。因此,Bun 的效率略低于 go-pg,但可以与不同的数据库一起使用。

最终,Bun 将取代 go-pg。要将现有的 go-pg 应用程序迁移到 Bun,请参阅此 指南