什么是 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,请参阅此 指南。