diff --git a/database/drivers/clickhouse/clickhouse.go b/database/drivers/clickhouse/clickhouse.go new file mode 100644 index 0000000..0db0767 --- /dev/null +++ b/database/drivers/clickhouse/clickhouse.go @@ -0,0 +1,61 @@ +// 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 clickhouse implements database.Driver for ClickHouse database. +package clickhouse + +import ( + "database/sql" + "fmt" + + _ "github.com/ClickHouse/clickhouse-go/v2" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for ClickHouse database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = `"` +) + +func init() { + if err := database.Register("clickhouse", New()); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for ClickHouse. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for ClickHouse. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for ClickHouse. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for ClickHouse. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + var source string + if config.Link != "" { + source = config.Link + } else { + source = fmt.Sprintf("clickhouse://%s:%s@%s:%s/%s", + config.User, config.Pass, config.Host, config.Port, config.Name) + } + return sql.Open("clickhouse", source) +} diff --git a/database/drivers/drivers.go b/database/drivers/drivers.go index 482f2be..bdd18bd 100644 --- a/database/drivers/drivers.go +++ b/database/drivers/drivers.go @@ -4,15 +4,27 @@ // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. -// Package drivers provides database drivers registration for GF ORM. -// This package automatically registers common database drivers when imported. +// Package drivers provides database drivers registration for our custom ORM. +// This package automatically registers all supported database drivers when imported. +// Supported databases: MySQL, MariaDB, PostgreSQL, SQL Server, Oracle, SQLite, ClickHouse package drivers import ( - _ "github.com/gogf/gf/contrib/drivers/clickhouse/v2" - _ "github.com/gogf/gf/contrib/drivers/mssql/v2" - _ "github.com/gogf/gf/contrib/drivers/mysql/v2" - _ "github.com/gogf/gf/contrib/drivers/oracle/v2" - _ "github.com/gogf/gf/contrib/drivers/pgsql/v2" - _ "github.com/gogf/gf/contrib/drivers/sqlite/v2" + // MySQL & MariaDB driver + _ "git.magicany.cc/black1552/gin-base/database/drivers/mysql" + + // PostgreSQL driver + _ "git.magicany.cc/black1552/gin-base/database/drivers/pgsql" + + // SQL Server driver + _ "git.magicany.cc/black1552/gin-base/database/drivers/mssql" + + // Oracle driver + _ "git.magicany.cc/black1552/gin-base/database/drivers/oracle" + + // SQLite driver (pure Go implementation, no CGO required) + _ "git.magicany.cc/black1552/gin-base/database/drivers/sqlite" + + // ClickHouse driver + _ "git.magicany.cc/black1552/gin-base/database/drivers/clickhouse" ) diff --git a/database/drivers/mssql/mssql.go b/database/drivers/mssql/mssql.go new file mode 100644 index 0000000..b26ba4e --- /dev/null +++ b/database/drivers/mssql/mssql.go @@ -0,0 +1,61 @@ +// 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 mssql implements database.Driver for Microsoft SQL Server. +package mssql + +import ( + "database/sql" + "fmt" + + _ "github.com/microsoft/go-mssqldb" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for SQL Server database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = `"` +) + +func init() { + if err := database.Register("mssql", New()); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for SQL Server. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for SQL Server. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for SQL Server. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for SQL Server. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + var source string + if config.Link != "" { + source = config.Link + } else { + source = fmt.Sprintf("sqlserver://%s:%s@%s:%s?database=%s", + config.User, config.Pass, config.Host, config.Port, config.Name) + } + return sql.Open("sqlserver", source) +} diff --git a/database/drivers/mysql/mysql.go b/database/drivers/mysql/mysql.go new file mode 100644 index 0000000..f19c0d4 --- /dev/null +++ b/database/drivers/mysql/mysql.go @@ -0,0 +1,83 @@ +// 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 mysql implements database.Driver for MySQL database. +package mysql + +import ( + "database/sql" + "fmt" + "strings" + + _ "github.com/go-sql-driver/mysql" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for MySQL database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = "`" +) + +func init() { + var ( + err error + driverObj = New() + ) + // Register for both mysql and mariadb (compatible protocol) + if err = database.Register("mysql", driverObj); err != nil { + panic(err) + } + if err = database.Register("mariadb", driverObj); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for MySQL. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for MySQL. +// It implements the interface of database.Driver for extra database driver installation. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for MySQL database. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for MySQL. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + var ( + source string + username = config.User + password = config.Pass + protocol = "tcp" + dbName = config.Name + params = make([]string, 0) + ) + + if config.Extra != "" { + params = append(params, config.Extra) + } + + // Default params + params = append(params, "loc=Local", "parseTime=true") + + source = fmt.Sprintf("%s:%s@%s(%s:%s)/%s?%s", + username, password, protocol, config.Host, config.Port, dbName, strings.Join(params, "&")) + + return sql.Open("mysql", source) +} diff --git a/database/drivers/oracle/oracle.go b/database/drivers/oracle/oracle.go new file mode 100644 index 0000000..5951af0 --- /dev/null +++ b/database/drivers/oracle/oracle.go @@ -0,0 +1,61 @@ +// 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 oracle implements database.Driver for Oracle database. +package oracle + +import ( + "database/sql" + "fmt" + + _ "github.com/sijms/go-ora/v2" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for Oracle database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = `"` +) + +func init() { + if err := database.Register("oracle", New()); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for Oracle. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for Oracle. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for Oracle. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for Oracle. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + var source string + if config.Link != "" { + source = config.Link + } else { + source = fmt.Sprintf("oracle://%s:%s@%s:%s/%s", + config.User, config.Pass, config.Host, config.Port, config.Name) + } + return sql.Open("oracle", source) +} diff --git a/database/drivers/pgsql/pgsql.go b/database/drivers/pgsql/pgsql.go new file mode 100644 index 0000000..b847918 --- /dev/null +++ b/database/drivers/pgsql/pgsql.go @@ -0,0 +1,71 @@ +// 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 pgsql implements database.Driver for PostgreSQL database. +package pgsql + +import ( + "database/sql" + "fmt" + + _ "github.com/lib/pq" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for PostgreSQL database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = `"` +) + +func init() { + if err := database.Register("pgsql", New()); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for PostgreSQL. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for PostgreSQL. +// It implements the interface of database.Driver for extra database driver installation. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for PostgreSQL database. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for PostgreSQL. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + var ( + source string + username = config.User + password = config.Pass + host = config.Host + port = config.Port + dbName = config.Name + ) + + source = fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", + host, port, username, password, dbName) + + if config.Extra != "" { + source += " " + config.Extra + } + + return sql.Open("postgres", source) +} diff --git a/database/drivers/sqlite/sqlite.go b/database/drivers/sqlite/sqlite.go new file mode 100644 index 0000000..9479b30 --- /dev/null +++ b/database/drivers/sqlite/sqlite.go @@ -0,0 +1,58 @@ +// 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 sqlite implements database.Driver for SQLite database. +package sqlite + +import ( + "database/sql" + + _ "modernc.org/sqlite" + + "git.magicany.cc/black1552/gin-base/database" +) + +// Driver is the driver for SQLite database. +type Driver struct { + *database.Core +} + +const ( + quoteChar = "`" +) + +func init() { + if err := database.Register("sqlite", New()); err != nil { + panic(err) + } +} + +// New creates and returns a driver that implements database.Driver for SQLite. +func New() database.Driver { + return &Driver{} +} + +// New creates and returns a database object for SQLite. +func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.DB, error) { + return &Driver{ + Core: core, + }, nil +} + +// GetChars returns the security char for SQLite. +func (d *Driver) GetChars() (charLeft string, charRight string) { + return quoteChar, quoteChar +} + +// Open creates and returns an underlying sql.DB object for SQLite. +func (d *Driver) Open(config *database.ConfigNode) (*sql.DB, error) { + // For SQLite, use the Name field as the database file path + dbName := config.Name + if dbName == "" { + dbName = ":memory:" + } + return sql.Open("sqlite", dbName) +} diff --git a/database/gdb_database.go b/database/gdb_database.go index ee6e50c..a1f59d4 100644 --- a/database/gdb_database.go +++ b/database/gdb_database.go @@ -20,7 +20,7 @@ const ( ConfigNodeNameDatabase = "database" ) -func Database(name ...string) gdb.DB { +func Database(name ...string) DB { var ( ctx = context.Background() group = gdb.DefaultGroupName @@ -137,7 +137,7 @@ func Database(name ...string) gdb.DB { return nil }) if db != nil { - return db.(gdb.DB) + return db.(DB) } return nil } diff --git a/go.mod b/go.mod index 8ba262e..06895ec 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( require ( filippo.io/edwards25519 v1.2.0 // indirect + gitee.com/chunanyong/dm v1.8.12 // indirect github.com/BurntSushi/toml v1.6.0 // indirect github.com/ClickHouse/clickhouse-go/v2 v2.0.15 // indirect github.com/VictoriaMetrics/easyproto v0.1.4 // indirect @@ -51,6 +52,8 @@ require ( github.com/godror/godror v0.50.0 // indirect github.com/godror/knownpb v0.3.0 // indirect github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.10.0 // indirect + github.com/gogf/gf/contrib/drivers/dm/v2 v2.10.0 // indirect + github.com/gogf/gf/contrib/drivers/mariadb/v2 v2.10.0 // indirect github.com/gogf/gf/contrib/drivers/mssql/v2 v2.10.0 // indirect github.com/gogf/gf/contrib/drivers/mysql/v2 v2.10.0 // indirect github.com/gogf/gf/contrib/drivers/oracle/v2 v2.10.0 // indirect diff --git a/go.sum b/go.sum index f862ccc..7296957 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q git.magicany.cc/black1552/gf-common v1.0.1017 h1:KP0e32CSOzIYg8Nfqj7zwGakO6Co9HYTuiDZupK7LsU= git.magicany.cc/black1552/gf-common v1.0.1017/go.mod h1:ln6bd5oXxPNsktr8xI3itmsqpVBn1j+4W7iaS0g7S0Q= git.magicany.cc/black1552/gf-common v1.0.1018/go.mod h1:ln6bd5oXxPNsktr8xI3itmsqpVBn1j+4W7iaS0g7S0Q= +gitee.com/chunanyong/dm v1.8.12 h1:WupbFZL0MRNIIiCPaLDHgFi5jkdkjzjPReuWPaInGwk= +gitee.com/chunanyong/dm v1.8.12/go.mod h1:EPRJnuPFgbyOFgJ0TRYCTGzhq+ZT4wdyaj/GW/LLcNg= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= @@ -93,6 +95,10 @@ github.com/godror/knownpb v0.3.0 h1:+caUdy8hTtl7X05aPl3tdL540TvCcaQA6woZQroLZMw= github.com/godror/knownpb v0.3.0/go.mod h1:PpTyfJwiOEAzQl7NtVCM8kdPCnp3uhxsZYIzZ5PV4zU= github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.10.0 h1:9PTchr92xIJej4tq5c+HOHSU7LGOHr3YfD7tuf23LW4= github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.10.0/go.mod h1:eKtLMs9uccxFvmoKOUCRQ/Se3nxhzEZwF0Ir13qbk5g= +github.com/gogf/gf/contrib/drivers/dm/v2 v2.10.0 h1:w4vPUIdPRLM3zxi0QGyP5YgdTy6fV9L0QOk9bWk5tig= +github.com/gogf/gf/contrib/drivers/dm/v2 v2.10.0/go.mod h1:cWfwD+df3eeRDx4B+Rsk2Qe5ljNlBeS3rY2iwpPvPKU= +github.com/gogf/gf/contrib/drivers/mariadb/v2 v2.10.0 h1:Dmg8d2sfX2AxETLFB9C0pj3ZjZSziOk6hN/78A7P9AA= +github.com/gogf/gf/contrib/drivers/mariadb/v2 v2.10.0/go.mod h1:W8L0w4cDyvZddYWJsZ5ys2mxOls5+u4zut/9tPcT0T4= github.com/gogf/gf/contrib/drivers/mssql/v2 v2.10.0 h1:mBs6XpNM34IdZPZv4Kv3LA8yhP2UisbONMLfnQVFvKM= github.com/gogf/gf/contrib/drivers/mssql/v2 v2.10.0/go.mod h1:mChbF9FrmiYMSE2rG3zdxI/oSTwaHsR5KbINAgt3KcY= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.10.0 h1:UvqxwinkelKxwdwnKUfdy51/ls4RL7MCeJqAZOVAy0I= @@ -115,6 +121,7 @@ github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2V github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -338,6 +345,7 @@ golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= diff --git a/server/server.go b/server/server.go index c171f27..e2c2ab9 100644 --- a/server/server.go +++ b/server/server.go @@ -13,7 +13,7 @@ import ( "git.magicany.cc/black1552/gin-base/config" "git.magicany.cc/black1552/gin-base/database" - _ "git.magicany.cc/black1552/gin-base/database/drivers" // 自动注册数据库驱动 + _ "git.magicany.cc/black1552/gin-base/database/drivers" // 自动注册数据库驱动(必须在 database 之前) "git.magicany.cc/black1552/gin-base/log" "git.magicany.cc/black1552/gin-base/middleware" "github.com/gin-gonic/gin" @@ -41,6 +41,10 @@ func initDatabase() { } log.Info("正在初始化数据库连接...") + + // 调试:打印已注册的驱动 + // database.PrintDrivers() // 如果需要可以添加这个函数 + defer func() { if err := recover(); err != nil { log.Error("数据库初始化失败:", err)