mirror of
https://github.com/hanzoai/sqlbuilder.git
synced 2026-10-01 00:37:42 +00:00
Merge pull request #133 from cemremengu/insertselect
add subselect builder for insert
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user