Merge pull request #133 from cemremengu/insertselect

add subselect builder for insert
This commit is contained in:
Huan Du
2023-11-20 18:30:21 +08:00
committed by GitHub
2 changed files with 50 additions and 0 deletions
+18
View File
@@ -13,6 +13,7 @@ const (
insertMarkerAfterInsertInto
insertMarkerAfterCols
insertMarkerAfterValues
insertMarkerAfterSelect
)
// NewInsertBuilder creates a new INSERT builder.
@@ -40,6 +41,8 @@ type InsertBuilder struct {
injection *injection
marker injectionMarker
sbHolder string
}
var _ Builder = new(InsertBuilder)
@@ -89,6 +92,13 @@ func (ib *InsertBuilder) Cols(col ...string) *InsertBuilder {
return ib
}
// Select returns a new SelectBuilder to build a SELECT statement inside the INSERT INTO.
func (isb *InsertBuilder) Select(col ...string) *SelectBuilder {
sb := Select(col...)
isb.sbHolder = isb.args.Add(sb)
return sb
}
// Values adds a list of values for a row in INSERT.
func (ib *InsertBuilder) Values(value ...interface{}) *InsertBuilder {
placeholders := make([]string, 0, len(value))
@@ -167,6 +177,14 @@ func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
ib.injection.WriteTo(buf, insertMarkerAfterCols)
}
if ib.sbHolder != "" {
buf.WriteString(" ")
buf.WriteString(ib.sbHolder)
ib.injection.WriteTo(buf, insertMarkerAfterSelect)
return ib.args.CompileWithFlavor(buf.String(), flavor, initialArg...)
}
if len(ib.values) > 0 {
buf.WriteLeadingString("VALUES ")
values := make([]string, 0, len(ib.values))
+32
View File
@@ -179,3 +179,35 @@ func ExampleInsertBuilder_SQL() {
// /* before */ INSERT INTO demo.user PARTITION (p0) (id, name, status, created_at) /* after cols */ VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE status = ?
// [3 Shawn Du 1 1234567890 1]
}
func ExampleInsertBuilder_subSelect() {
ib := NewInsertBuilder()
ib.InsertInto("demo.user")
ib.Cols("id", "name")
sb := ib.Select("id", "name").From("demo.test")
sb.Where(sb.EQ("id", 1))
sql, args := ib.Build()
fmt.Println(sql)
fmt.Println(args)
// Output:
// INSERT INTO demo.user (id, name) SELECT id, name FROM demo.test WHERE id = ?
// [1]
}
func ExampleInsertBuilder_subSelect_oracle() {
ib := Oracle.NewInsertBuilder()
ib.InsertInto("demo.user")
ib.Cols("id", "name")
sb := ib.Select("id", "name").From("demo.test")
sb.Where(sb.EQ("id", 1))
sql, args := ib.Build()
fmt.Println(sql)
fmt.Println(args)
// Output:
// INSERT INTO demo.user (id, name) SELECT id, name FROM demo.test WHERE id = :1
// [1]
}