SQL 占位符

简介

Bun 识别查询中的 ? 为占位符,并将其替换为提供的参数。Bun 对字符串值进行引用和转义,并删除空字节。

基本和位置占位符

要使用基本占位符

// SELECT 'foo', 'bar'
db.ColumnExpr("?, ?", 'foo', 'bar')

要使用位置占位符

// SELECT 'foo', 'bar', 'foo'
db.ColumnExpr("?0, ?1, ?0", 'foo', 'bar')

bun.Ident

要引用 SQL 标识符(例如,列名或表名),请使用 bun.Ident

q.ColumnExpr("? = ?", bun.Ident("foo"), "bar")
"foo" = 'bar' -- PostgreSQL
`foo` = 'bar' -- MySQL

bun.Safe

要完全禁用引用,请使用 bun.Safe

q.TableExpr("(?) AS foo", bun.Safe("generate_series(0, 10)"))
FROM (generate_series(0, 10)) AS foo

IN

提供 bun.In 帮助程序来生成 IN (...) 查询

// WHERE foo IN ('hello', 'world')
q.Where("foo IN (?)", bun.In([]string{"hello", "world"}))

对于复合(多个)键,可以使用嵌套切片

// WHERE (foo, bar) IN (('hello', 'world'), ('hell', 'yeah'))
q.Where("(foo, bar) IN (?)", bun.In([][]string{
	{"hello", "world"},
	{"hell", "yeah"},
}))

模型占位符

Bun 还支持以下模型占位符

  • ?TableName - 模型表名,例如 "users"
  • ?TableAlias - 模型表别名,例如 "user"
  • ?PKs - 表主键,例如 "id"
  • ?TablePKs - 带有别名的表主键,例如 "user"."id"
  • ?Columns - 表列,例如 "id", "name", "emails"
  • ?TableColumns - 带有别名的表列,例如 "user"."id", "user"."name", "user"."emails"

有关详细信息,请参阅 占位符在新窗口中打开 示例。

全局占位符

Bun 还支持全局占位符

// db1 and db2 share the same *sql.DB, but have different named args.
db1 := db.WithNamedArg("SCHEMA", bun.Ident("foo"))
db2 := db.WithNamedArg("SCHEMA", bun.Ident("bar"))

// FROM foo.table
db1.NewSelect().TableExpr("?SCHEMA.table")

// FROM bar.table
db2.NewSelect().TableExpr("?SCHEMA.table")