diff --git a/contrib/drivers/README.MD b/contrib/drivers/README.MD index c79d6092644..e3af52d2a24 100644 --- a/contrib/drivers/README.MD +++ b/contrib/drivers/README.MD @@ -1,18 +1,31 @@ # drivers + Powerful database drivers for package gdb. # Installation + Let's take `mysql` for example. -``` + +```shell go get -u github.com/gogf/gf/contrib/drivers/mysql/v2 +# Easy to copy +go get -u github.com/gogf/gf/contrib/drivers/clickhouse/v2 +go get -u github.com/gogf/gf/contrib/drivers/dm/v2 +go get -u github.com/gogf/gf/contrib/drivers/mssql/v2 +go get -u github.com/gogf/gf/contrib/drivers/oracle/v2 +go get -u github.com/gogf/gf/contrib/drivers/pgsql/v2 +go get -u github.com/gogf/gf/contrib/drivers/sqlite/v2 +go get -u github.com/gogf/gf/contrib/drivers/sqlitecgo/v2 ``` Choose and import the driver to your project: -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/mysql/v2" ``` Commonly imported at top of `main.go`: + ```go package main @@ -31,60 +44,80 @@ func main() { ## MySQL/MariaDB/TiDB -``` +```go import _ "github.com/gogf/gf/contrib/drivers/mysql/v2" ``` ## SQLite -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/sqlite/v2" ``` -## PostgreSQL +### cgo version for 32-bit windows + +```go +import _ "github.com/gogf/gf/contrib/drivers/sqlitecgo/v2" ``` + +## PostgreSQL + +```go import _ "github.com/gogf/gf/contrib/drivers/pgsql/v2" ``` + Note: + - It does not support `Replace` features. ## SQL Server -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/mssql/v2" ``` + Note: + - It does not support `Replace` features. - It does not support `LastInsertId`. - It supports server version >= `SQL Server2005` -- It ONLY supports datetime2 and datetimeoffset types for auto handling created_at/updated_at/deleted_at columns, because datetime type does not support microseconds precision when column value is passed as string. +- It ONLY supports datetime2 and datetimeoffset types for auto handling created_at/updated_at/deleted_at columns, because datetime type does not support microseconds precision when column value is passed as string. ## Oracle -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/oracle/v2" ``` + Note: + - It does not support `Replace` features. - It does not support `LastInsertId`. ## ClickHouse -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/clickhouse/v2" ``` + Note: + - It does not support `InsertIgnore/InsertGetId` features. - It does not support `Save/Replace` features. - It does not support `Transaction` feature. - It does not support `RowsAffected` feature. ## DM -``` + +```go import _ "github.com/gogf/gf/contrib/drivers/dm/v2" ``` -Note: -- It does not support `Replace` features. +Note: +- It does not support `Replace` features. # Custom Drivers -It's quick and easy, please refer to current driver source. +It's quick and easy, please refer to current driver source. It's quite appreciated if any PR for new drivers support into current repo. diff --git a/contrib/drivers/sqlitecgo/go.mod b/contrib/drivers/sqlitecgo/go.mod index 15f45a45dce..138d2df4e2a 100644 --- a/contrib/drivers/sqlitecgo/go.mod +++ b/contrib/drivers/sqlitecgo/go.mod @@ -3,7 +3,6 @@ module github.com/gogf/gf/contrib/drivers/sqlitecgo/v2 go 1.18 require ( - github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.7.0 github.com/gogf/gf/v2 v2.7.0 github.com/mattn/go-sqlite3 v1.14.17 ) @@ -11,13 +10,10 @@ require ( require ( github.com/BurntSushi/toml v1.2.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grokify/html-strip-tags-go v0.0.1 // indirect github.com/magiconair/properties v1.8.6 // indirect @@ -25,7 +21,6 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/sdk v1.14.0 // indirect @@ -34,13 +29,6 @@ require ( golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.22.5 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/sqlite v1.23.1 // indirect ) -replace ( - github.com/gogf/gf/contrib/drivers/sqlite/v2 => ../sqlite/ - github.com/gogf/gf/v2 => ../../../ -) +replace github.com/gogf/gf/v2 => ../../../ diff --git a/contrib/drivers/sqlitecgo/go.sum b/contrib/drivers/sqlitecgo/go.sum index 1103427726a..22f425241f8 100644 --- a/contrib/drivers/sqlitecgo/go.sum +++ b/contrib/drivers/sqlitecgo/go.sum @@ -3,23 +3,16 @@ github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= -github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= @@ -39,9 +32,6 @@ github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -64,11 +54,3 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= -modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= -modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= diff --git a/contrib/drivers/sqlitecgo/sqlitecgo.go b/contrib/drivers/sqlitecgo/sqlitecgo.go index e77b3f25945..efaab979cbe 100644 --- a/contrib/drivers/sqlitecgo/sqlitecgo.go +++ b/contrib/drivers/sqlitecgo/sqlitecgo.go @@ -13,28 +13,18 @@ package sqlitecgo import ( - "database/sql" - "fmt" - _ "github.com/mattn/go-sqlite3" - "github.com/gogf/gf/contrib/drivers/sqlite/v2" "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/encoding/gurl" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" ) // Driver is the driver for sqlite database. type Driver struct { - gdb.DB + *gdb.Core } -var ( - sqliteDriver = sqlite.New() +const ( + quoteChar = "`" ) func init() { @@ -51,62 +41,12 @@ func New() gdb.Driver { // New creates and returns a database object for sqlite. // It implements the interface of gdb.Driver for extra database driver installation. func (d *Driver) New(core *gdb.Core, node *gdb.ConfigNode) (gdb.DB, error) { - db, err := sqliteDriver.New(core, node) - if err != nil { - return nil, err - } return &Driver{ - DB: db, + Core: core, }, nil } -// Open creates and returns an underlying sql.DB object for sqlite. -// https://github.com/mattn/go-sglite3 -func (d *Driver) Open(config *gdb.ConfigNode) (db *sql.DB, err error) { - var ( - source string - underlyingDriverName = "sqlite3" - ) - if config.Link != "" { - // ============================================================================ - // Deprecated from v2.2.0. - // ============================================================================ - source = config.Link - } else { - source = config.Name - } - // It searches the source file to locate its absolute path.. - if absolutePath, _ := gfile.Search(source); absolutePath != "" { - source = absolutePath - } - - // Multiple PRAGMAs can be specified, e.g.: - // path/to/some.db?_pragma=busy_timeout(5000)&_pragma=journal_mode(WAL) - if config.Extra != "" { - var ( - options string - extraMap map[string]interface{} - ) - if extraMap, err = gstr.Parse(config.Extra); err != nil { - return nil, err - } - for k, v := range extraMap { - if options != "" { - options += "&" - } - options += fmt.Sprintf(`_pragma=%s(%s)`, k, gurl.Encode(gconv.String(v))) - } - if len(options) > 1 { - source += "?" + options - } - } - - if db, err = sql.Open(underlyingDriverName, source); err != nil { - err = gerror.WrapCodef( - gcode.CodeDbOperationError, err, - `sql.Open failed for driver "%s" by source "%s"`, underlyingDriverName, source, - ) - return nil, err - } - return +// GetChars returns the security char for this type of database. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar } diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_do_filter.go b/contrib/drivers/sqlitecgo/sqlitecgo_do_filter.go new file mode 100644 index 00000000000..f53e4eadf78 --- /dev/null +++ b/contrib/drivers/sqlitecgo/sqlitecgo_do_filter.go @@ -0,0 +1,37 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package sqlitecgo + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/text/gstr" +) + +// DoFilter deals with the sql string before commits it to underlying sql driver. +func (d *Driver) DoFilter(ctx context.Context, link gdb.Link, sql string, args []interface{}) (newSql string, newArgs []interface{}, err error) { + // Special insert/ignore operation for sqlite. + switch { + case gstr.HasPrefix(sql, gdb.InsertOperationIgnore): + sql = "INSERT OR IGNORE" + sql[len(gdb.InsertOperationIgnore):] + + case gstr.HasPrefix(sql, gdb.InsertOperationReplace): + sql = "INSERT OR REPLACE" + sql[len(gdb.InsertOperationReplace):] + + default: + if gstr.Contains(sql, gdb.InsertOnDuplicateKeyUpdate) { + return sql, args, gerror.NewCode( + gcode.CodeNotSupported, + `Save operation is not supported by sqlite driver`, + ) + } + } + return d.Core.DoFilter(ctx, link, sql, args) +} diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_open.go b/contrib/drivers/sqlitecgo/sqlitecgo_open.go new file mode 100644 index 00000000000..7c014d69d2d --- /dev/null +++ b/contrib/drivers/sqlitecgo/sqlitecgo_open.go @@ -0,0 +1,79 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package sqlitecgo implements gdb.Driver, which supports operations for database SQLite. +// +// Note: +// 1. Using sqlitecgo is for building a 32-bit Windows operating system +// 2. You need to set the environment variable CGO_ENABLED=1 and make sure that GCC is installed +// on your path. windows gcc: https://jmeubank.github.io/tdm-gcc/ +package sqlitecgo + +import ( + "database/sql" + "fmt" + + _ "github.com/mattn/go-sqlite3" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/encoding/gurl" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" +) + +// Open creates and returns an underlying sql.DB object for sqlite. +// https://github.com/mattn/go-sglite3 +func (d *Driver) Open(config *gdb.ConfigNode) (db *sql.DB, err error) { + var ( + source string + underlyingDriverName = "sqlite3" + ) + if config.Link != "" { + // ============================================================================ + // Deprecated from v2.2.0. + // ============================================================================ + source = config.Link + } else { + source = config.Name + } + // It searches the source file to locate its absolute path.. + if absolutePath, _ := gfile.Search(source); absolutePath != "" { + source = absolutePath + } + + // Multiple PRAGMAs can be specified, e.g.: + // path/to/some.db?_pragma=busy_timeout(5000)&_pragma=journal_mode(WAL) + if config.Extra != "" { + var ( + options string + extraMap map[string]interface{} + ) + if extraMap, err = gstr.Parse(config.Extra); err != nil { + return nil, err + } + for k, v := range extraMap { + if options != "" { + options += "&" + } + options += fmt.Sprintf(`_pragma=%s(%s)`, k, gurl.Encode(gconv.String(v))) + } + if len(options) > 1 { + source += "?" + options + } + } + + if db, err = sql.Open(underlyingDriverName, source); err != nil { + err = gerror.WrapCodef( + gcode.CodeDbOperationError, err, + `sql.Open failed for driver "%s" by source "%s"`, underlyingDriverName, source, + ) + return nil, err + } + return +} diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_table_fields.go b/contrib/drivers/sqlitecgo/sqlitecgo_table_fields.go new file mode 100644 index 00000000000..8f244d1772f --- /dev/null +++ b/contrib/drivers/sqlitecgo/sqlitecgo_table_fields.go @@ -0,0 +1,55 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package sqlitecgo implements gdb.Driver, which supports operations for database SQLite. +// +// Note: +// 1. Using sqlitecgo is for building a 32-bit Windows operating system +// 2. You need to set the environment variable CGO_ENABLED=1 and make sure that GCC is installed +// on your path. windows gcc: https://jmeubank.github.io/tdm-gcc/ +package sqlitecgo + +import ( + "context" + "fmt" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/util/gutil" +) + +// TableFields retrieves and returns the fields' information of specified table of current schema. +// +// Also see DriverMysql.TableFields. +func (d *Driver) TableFields(ctx context.Context, table string, schema ...string) (fields map[string]*gdb.TableField, err error) { + var ( + result gdb.Result + link gdb.Link + usedSchema = gutil.GetOrDefaultStr(d.GetSchema(), schema...) + ) + if link, err = d.SlaveLink(usedSchema); err != nil { + return nil, err + } + result, err = d.DoSelect(ctx, link, fmt.Sprintf(`PRAGMA TABLE_INFO(%s)`, d.QuoteWord(table))) + if err != nil { + return nil, err + } + fields = make(map[string]*gdb.TableField) + for i, m := range result { + mKey := "" + if m["pk"].Bool() { + mKey = "pri" + } + fields[m["name"].String()] = &gdb.TableField{ + Index: i, + Name: m["name"].String(), + Type: m["type"].String(), + Key: mKey, + Default: m["dflt_value"].Val(), + Null: !m["notnull"].Bool(), + } + } + return fields, nil +} diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_tables.go b/contrib/drivers/sqlitecgo/sqlitecgo_tables.go new file mode 100644 index 00000000000..d985c3a62af --- /dev/null +++ b/contrib/drivers/sqlitecgo/sqlitecgo_tables.go @@ -0,0 +1,38 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package sqlitecgo + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" +) + +// Tables retrieves and returns the tables of current schema. +// It's mainly used in cli tool chain for automatically generating the models. +func (d *Driver) Tables(ctx context.Context, schema ...string) (tables []string, err error) { + var result gdb.Result + link, err := d.SlaveLink(schema...) + if err != nil { + return nil, err + } + + result, err = d.DoSelect( + ctx, + link, + `SELECT NAME FROM SQLITE_MASTER WHERE TYPE='table' ORDER BY NAME`, + ) + if err != nil { + return + } + for _, m := range result { + for _, v := range m { + tables = append(tables, v.String()) + } + } + return +} diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go b/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go index b84141ca8d8..05e146d769f 100644 --- a/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go +++ b/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go @@ -364,58 +364,18 @@ func Test_Model_Save(t *testing.T) { table := createTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } var ( - user User - count int - result sql.Result - err error + err error ) - result, err = db.Model(table).Data(g.Map{ + _, err = db.Model(table).Data(g.Map{ "id": 1, "passport": "CN", "password": "12345678", "nickname": "oldme", "create_time": CreateTime, }).OnConflict("id").Save() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Id, 1) - t.Assert(user.Passport, "CN") - t.Assert(user.Password, "12345678") - t.Assert(user.NickName, "oldme") - t.Assert(user.CreateTime.String(), CreateTime) - - _, err = db.Model(table).Data(g.Map{ - "id": 1, - "passport": "CN", - "password": "abc123456", - "nickname": "to be not to be", - "create_time": CreateTime, - }).OnConflict("id").Save() - t.AssertNil(err) - - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Passport, "CN") - t.Assert(user.Password, "abc123456") - t.Assert(user.NickName, "to be not to be") - t.Assert(user.CreateTime.String(), CreateTime) - - count, err = db.Model(table).Count() - t.AssertNil(err) - t.Assert(count, 1) + t.Assert(err, ErrorSave) }) }