diff --git a/.example/database/gdb/mysql/config.toml b/.example/database/gdb/mysql/config.toml index 8e48cd1e5..48a479b62 100644 --- a/.example/database/gdb/mysql/config.toml +++ b/.example/database/gdb/mysql/config.toml @@ -2,7 +2,7 @@ # MySQL. [database] debug = true - link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test?parseTime=true&loc=Local" + link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test?parseTime=true" MaxOpen = 100 # Redis. diff --git a/.example/database/gdb/mysql/gdb_value.go b/.example/database/gdb/mysql/gdb_value.go index 0fa7af53a..abf8f363a 100644 --- a/.example/database/gdb/mysql/gdb_value.go +++ b/.example/database/gdb/mysql/gdb_value.go @@ -2,11 +2,17 @@ package main import ( "github.com/gogf/gf/frame/g" + "time" ) func main() { db := g.DB() db.SetDebug(true) - db.Table("user").Data("num=num+1").Where("id", 8).Update() + t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 19:03:32") + t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 19:03:34") + u, err := g.DB().Table("orders").Where("updated_at>? and updated_at? and updated_at'2020-10-27 19:03:32' and updated_at<'2020-10-27 19:03:34'").Value() + g.Dump(u, err) } diff --git a/database/gdb/gdb_driver_mysql.go b/database/gdb/gdb_driver_mysql.go index 34d63d3a6..b94b38443 100644 --- a/database/gdb/gdb_driver_mysql.go +++ b/database/gdb/gdb_driver_mysql.go @@ -41,7 +41,7 @@ func (d *DriverMysql) Open(config *ConfigNode) (*sql.DB, error) { } } else { source = fmt.Sprintf( - "%s:%s@tcp(%s:%s)/%s?charset=%s&multiStatements=true&parseTime=true&loc=Local", + "%s:%s@tcp(%s:%s)/%s?charset=%s&multiStatements=true&parseTime=true", config.User, config.Pass, config.Host, config.Port, config.Name, config.Charset, ) } diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index 5427292e2..b480e2743 100644 --- a/database/gdb/gdb_z_mysql_model_test.go +++ b/database/gdb/gdb_z_mysql_model_test.go @@ -2836,3 +2836,87 @@ func Test_Model_HasField(t *testing.T) { t.Assert(err, nil) }) } + +// Issue: https://github.com/gogf/gf/issues/1002 +func Test_Model_Issue1002(t *testing.T) { + table := createTable() + defer dropTable(table) + + result, err := db.Table(table).Data(g.Map{ + "id": 1, + "passport": "port_1", + "password": "pass_1", + "nickname": "name_2", + "create_time": "2020-10-27 19:03:33", + }).Insert() + gtest.Assert(err, nil) + n, _ := result.RowsAffected() + gtest.Assert(n, 1) + + // where + string. + gtest.C(t, func(t *gtest.T) { + v, err := db.Table(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() + t.Assert(err, nil) + t.Assert(v.Int(), 1) + }) + gtest.C(t, func(t *gtest.T) { + v, err := db.Table(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").FindValue() + t.Assert(err, nil) + t.Assert(v.Int(), 1) + }) + gtest.C(t, func(t *gtest.T) { + v, err := db.Table(table).Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").FindValue("id") + t.Assert(err, nil) + t.Assert(v.Int(), 1) + }) + // where + string arguments. + gtest.C(t, func(t *gtest.T) { + v, err := db.Table(table).Fields("id").Where("create_time>? and create_time? and create_time? and create_time? and create_time? and create_time? and create_time? and create_time? and create_time? and create_time as a string with more manually readable. func Export(i ...interface{}) string { buffer := bytes.NewBuffer(nil) - for _, v := range i { - switch r := v.(type) { + for _, value := range i { + switch r := value.(type) { case []byte: buffer.Write(r) case string: buffer.WriteString(r) default: var ( - rv = reflect.ValueOf(v) - kind = rv.Kind() + reflectValue = reflect.ValueOf(value) + reflectKind = reflectValue.Kind() ) - if kind == reflect.Ptr { - rv = rv.Elem() - kind = rv.Kind() + for reflectKind == reflect.Ptr { + reflectValue = reflectValue.Elem() + reflectKind = reflectValue.Kind() } - switch kind { + switch reflectKind { case reflect.Slice, reflect.Array: - v = gconv.Interfaces(v) + value = gconv.Interfaces(value) case reflect.Map: - v = gconv.Map(v) + value = gconv.Map(value) case reflect.Struct: - if r, ok := v.(apiMapStrAny); ok { - v = r.MapStrAny() - } else if r, ok := v.(apiString); ok { - v = r.String() + converted := false + if r, ok := value.(apiVal); ok { + if result := r.Val(); result != nil { + value = result + converted = true + } + } + if !converted { + if r, ok := value.(apiMapStrAny); ok { + if result := r.MapStrAny(); result != nil { + value = result + converted = true + } + } + } + if !converted { + if r, ok := value.(apiString); ok { + value = r.String() + } } } encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(false) encoder.SetIndent("", "\t") - if err := encoder.Encode(v); err != nil { + if err := encoder.Encode(value); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } }