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