diff --git a/Gopkg.lock b/Gopkg.lock index bfcd4b2e94..b564402d6f 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1792,11 +1792,11 @@ [[projects]] branch = "master" - digest = "1:1640ede25f864bdbf1e1c00a5e3884b2184fa1c510f5e7dabcf0294f5f7eb4c2" + digest = "1:01f3312e3e5efad1527fa9f65a2c8a23f1b88228b2898d5b695f8223c80147a3" name = "yunion.io/x/sqlchemy" packages = ["."] pruneopts = "UT" - revision = "54a3c244244554946225edd4d7e1c7043bc46663" + revision = "e67c599d9d7a81a1a08738924b74c881ce6a5a57" [[projects]] branch = "master" diff --git a/vendor/yunion.io/x/sqlchemy/errors.go b/vendor/yunion.io/x/sqlchemy/errors.go index 88d0ca39ae..faf4226718 100644 --- a/vendor/yunion.io/x/sqlchemy/errors.go +++ b/vendor/yunion.io/x/sqlchemy/errors.go @@ -21,9 +21,11 @@ import ( var ErrNoDataToUpdate error var ErrDuplicateEntry error var ErrEmptyQuery error +var ErrEmptyPrimaryKey error func init() { ErrNoDataToUpdate = errors.New("No data to update") ErrDuplicateEntry = errors.New("duplicate entry") ErrEmptyQuery = errors.New("empty query") + ErrEmptyPrimaryKey = errors.New("empty primary keys") } diff --git a/vendor/yunion.io/x/sqlchemy/insert.go b/vendor/yunion.io/x/sqlchemy/insert.go index abba06f8bf..b93ee0114e 100644 --- a/vendor/yunion.io/x/sqlchemy/insert.go +++ b/vendor/yunion.io/x/sqlchemy/insert.go @@ -122,6 +122,10 @@ func (t *STableSpec) insertSqlPrep(dataFields reflectutils.SStructFieldValueSet, panic(fmt.Sprintf("multiple auto_increment columns: %q, %q", autoIncField, k)) } autoIncField = k + } else if c.IsText() { + values = append(values, "") + names = append(names, fmt.Sprintf("`%s`", k)) + format = append(format, "?") } else { return "", nil, fmt.Errorf("cannot insert for null primary key %q", k) } diff --git a/vendor/yunion.io/x/sqlchemy/update.go b/vendor/yunion.io/x/sqlchemy/update.go index bd3f1f1122..0a54ffb089 100644 --- a/vendor/yunion.io/x/sqlchemy/update.go +++ b/vendor/yunion.io/x/sqlchemy/update.go @@ -101,6 +101,16 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { k := c.Name() of, _ := ofields.GetInterface(k) nf, _ := fields.GetInterface(k) + if c.IsPrimary() { + if !gotypes.IsNil(of) && !c.IsZero(of) { + primaries[k] = of + } else if c.IsText() { + primaries[k] = "" + } else { + return nil, ErrEmptyPrimaryKey + } + continue + } if !gotypes.IsNil(of) { if c.IsPrimary() && !c.IsZero(of) { // skip update primary key primaries[k] = of @@ -156,7 +166,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { buf.WriteString(" WHERE ") first = true if len(primaries) == 0 { - return nil, fmt.Errorf("primary key empty???") + return nil, ErrEmptyPrimaryKey } for k, v := range primaries { if first {