update dependencies

This commit is contained in:
dhax 2017-10-21 18:30:08 +02:00
parent fce1b99683
commit 397e9c0842
164 changed files with 5207 additions and 2213 deletions

View file

@ -20,7 +20,7 @@ type Field struct {
GoName string // struct field name, e.g. Id
SQLName string // SQL name, .e.g. id
Column types.Q // escaped SQL name
Column types.Q // escaped SQL name, e.g. "id"
SQLType string
Index []int
Default types.Q

View file

@ -52,36 +52,41 @@ func (q insertQuery) AppendQuery(b []byte) ([]byte, error) {
} else {
b = q.q.appendFirstTable(b)
}
b = append(b, " ("...)
if q.q.hasModel() {
b = appendColumns(b, table.Fields)
} else if q.q.columns != nil {
b = q.q.appendColumns(b)
}
b = append(b, ')')
if q.q.hasModel() {
b = append(b, " VALUES ("...)
if q.q.hasOtherTables() && q.q.columns != nil {
b = append(b, " ("...)
b = q.q.appendColumns(b)
b = append(b, ")"...)
b = append(b, " SELECT * FROM "...)
b = q.q.appendOtherTables(b)
} else {
fields, err := q.q.getFields()
if err != nil {
return nil, err
}
if len(fields) == 0 {
fields = table.Fields
}
b = append(b, " ("...)
b = appendColumns(b, fields)
b = append(b, ") VALUES ("...)
if value.Kind() == reflect.Struct {
b = q.appendValues(b, table.Fields, value)
b = q.appendValues(b, fields, value)
} else {
for i := 0; i < value.Len(); i++ {
el := value.Index(i)
if el.Kind() == reflect.Interface {
el = el.Elem()
}
b = q.appendValues(b, table.Fields, reflect.Indirect(el))
b = q.appendValues(b, fields, reflect.Indirect(el))
if i != value.Len()-1 {
b = append(b, "), ("...)
}
}
}
b = append(b, ')')
}
if q.q.hasOtherTables() {
b = append(b, " SELECT * FROM "...)
b = q.q.appendOtherTables(b)
b = append(b, ")"...)
}
if q.q.onConflict != nil {

View file

@ -43,6 +43,18 @@ type InsertQTest struct {
}
var _ = Describe("Insert", func() {
It("supports Column", func() {
model := &InsertTest{
Id: 1,
Value: "hello",
}
q := NewQuery(nil, model).Column("id")
b, err := insertQuery{q: q}.AppendQuery(nil)
Expect(err).NotTo(HaveOccurred())
Expect(string(b)).To(Equal(`INSERT INTO "insert_tests" ("id") VALUES (1)`))
})
It("multi inserts", func() {
q := NewQuery(nil, &InsertTest{
Id: 1,

View file

@ -188,7 +188,7 @@ func (q *Query) getDataFields() ([]*Field, error) {
return q._getFields(true)
}
func (q *Query) _getFields(filterPKs bool) ([]*Field, error) {
func (q *Query) _getFields(omitPKs bool) ([]*Field, error) {
table := q.model.Table()
var columns []*Field
@ -203,7 +203,7 @@ func (q *Query) _getFields(filterPKs bool) ([]*Field, error) {
return nil, err
}
if filterPKs && field.HasFlag(PrimaryKeyFlag) {
if omitPKs && field.HasFlag(PrimaryKeyFlag) {
continue
}
@ -595,10 +595,16 @@ func (q *Query) SelectOrInsert(values ...interface{}) (inserted bool, err error)
return false, q.stickyErr
}
insertq := q
if len(insertq.columns) > 0 {
insertq = insertq.Copy()
insertq.columns = nil
}
var insertErr error
for i := 0; i < 5; i++ {
if i >= 2 {
time.Sleep(internal.RetryBackoff(i-2, 250*time.Millisecond, 4*time.Second))
time.Sleep(internal.RetryBackoff(i-2, 250*time.Millisecond, 5*time.Second))
}
err := q.Select(values...)
@ -609,7 +615,7 @@ func (q *Query) SelectOrInsert(values ...interface{}) (inserted bool, err error)
return false, err
}
res, err := q.Insert(values...)
res, err := insertq.Insert(values...)
if err != nil {
insertErr = err
if pgErr, ok := err.(internal.PGError); ok {
@ -636,12 +642,21 @@ func (q *Query) SelectOrInsert(values ...interface{}) (inserted bool, err error)
}
// Update updates the model.
func (q *Query) Update(values ...interface{}) (Result, error) {
func (q *Query) Update(scan ...interface{}) (Result, error) {
return q.update(scan, false)
}
// Update updates the model omitting null columns.
func (q *Query) UpdateNotNull(scan ...interface{}) (Result, error) {
return q.update(scan, true)
}
func (q *Query) update(scan []interface{}, omitZero bool) (Result, error) {
if q.stickyErr != nil {
return nil, q.stickyErr
}
model, err := q.newModel(values...)
model, err := q.newModel(scan...)
if err != nil {
return nil, err
}
@ -652,7 +667,7 @@ func (q *Query) Update(values ...interface{}) (Result, error) {
}
}
res, err := q.db.Query(model, updateQuery{q}, q.model)
res, err := q.db.Query(model, updateQuery{q: q, omitZero: omitZero}, q.model)
if err != nil {
return nil, err
}

View file

@ -32,10 +32,10 @@ type Table struct {
Alias types.Q
ModelName string
Fields []*Field
PKs []*Field
Columns []*Field
FieldsMap map[string]*Field
Fields []*Field // PKs + DataFields
PKs []*Field
DataFields []*Field
FieldsMap map[string]*Field
Methods map[string]*Method
Relations map[string]*Relation
@ -71,7 +71,7 @@ func (t *Table) AddField(field *Field) {
if field.HasFlag(PrimaryKeyFlag) {
t.PKs = append(t.PKs, field)
} else {
t.Columns = append(t.Columns, field)
t.DataFields = append(t.DataFields, field)
}
t.FieldsMap[field.SQLName] = field
}

View file

@ -17,6 +17,8 @@ func Update(db DB, model ...interface{}) error {
type updateQuery struct {
q *Query
omitZero bool
}
var _ QueryAppender = (*updateQuery)(nil)
@ -107,12 +109,18 @@ func (q updateQuery) appendSetStruct(b []byte, strct reflect.Value) ([]byte, err
}
if len(fields) == 0 {
fields = q.q.model.Table().Columns
fields = q.q.model.Table().DataFields
}
for i, f := range fields {
if i > 0 {
pos := len(b)
for _, f := range fields {
if q.omitZero && f.OmitZero(strct) {
continue
}
if len(b) != pos {
b = append(b, ", "...)
pos = len(b)
}
b = append(b, f.Column...)
@ -129,7 +137,7 @@ func (q updateQuery) appendSetSlice(b []byte, slice reflect.Value) ([]byte, erro
}
if len(fields) == 0 {
fields = q.q.model.Table().Columns
fields = q.q.model.Table().DataFields
}
for i, f := range fields {

View file

@ -11,6 +11,22 @@ type UpdateTest struct {
}
var _ = Describe("Update", func() {
It("updates model", func() {
q := NewQuery(nil, &UpdateTest{})
b, err := updateQuery{q: q}.AppendQuery(nil)
Expect(err).NotTo(HaveOccurred())
Expect(string(b)).To(Equal(`UPDATE "update_tests" AS "update_test" SET "value" = NULL WHERE "update_test"."id" = NULL`))
})
It("omits zero", func() {
q := NewQuery(nil, &UpdateTest{})
b, err := updateQuery{q: q, omitZero: true}.AppendQuery(nil)
Expect(err).NotTo(HaveOccurred())
Expect(string(b)).To(Equal(`UPDATE "update_tests" AS "update_test" SET WHERE "update_test"."id" = NULL`))
})
It("bulk updates", func() {
q := NewQuery(nil, &UpdateTest{}).
Model(&UpdateTest{
@ -20,7 +36,7 @@ var _ = Describe("Update", func() {
Id: 2,
})
b, err := updateQuery{q}.AppendQuery(nil)
b, err := updateQuery{q: q}.AppendQuery(nil)
Expect(err).NotTo(HaveOccurred())
Expect(string(b)).To(Equal(`UPDATE "update_tests" AS "update_test" SET "value" = _data."value" FROM (VALUES (1, 'hello'::mytype), (2, NULL::mytype)) AS _data("id", "value") WHERE "update_test"."id" = _data."id"`))
})
@ -32,7 +48,7 @@ var _ = Describe("Update", func() {
Table("wrapper").
Where("update_test.id = wrapper.id")
b, err := updateQuery{q}.AppendQuery(nil)
b, err := updateQuery{q: q}.AppendQuery(nil)
Expect(err).NotTo(HaveOccurred())
Expect(string(b)).To(Equal(`WITH "wrapper" AS (SELECT "update_test"."id", "update_test"."value" FROM "update_tests" AS "update_test") UPDATE "update_tests" AS "update_test" SET "value" = NULL FROM "wrapper" WHERE (update_test.id = wrapper.id)`))
})