From 6739f8871aa486b88eafc39cfc81914b04c86b74 Mon Sep 17 00:00:00 2001 From: alimy Date: Sat, 11 Jun 2022 23:36:16 +0800 Subject: [PATCH] support sqlite3 as database --- config.yaml.sample | 15 ++++++----- go.mod | 5 ++-- go.sum | 18 ++++++++------ internal/conf/conf.go | 8 ++++-- internal/conf/db.go | 52 ++++++++++++++++++++++----------------- internal/conf/settting.go | 23 +++++++++++++++-- 6 files changed, 79 insertions(+), 42 deletions(-) diff --git a/config.yaml.sample b/config.yaml.sample index 7809806b..9e61e9be 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -12,10 +12,10 @@ Server: # 服务设置 ReadTimeout: 60 WriteTimeout: 60 Features: - Default: ["Base", "Option", "MinIO", "LoggerFile"] - Develop: ["Base", "Option", "Sms", "AliOSS", "LoggerZinc"] - Slim: ["Base", "LocalOSS", "LoggerFile"] - Base: ["Zinc", "MySQL", "Redis", "Alipay",] + Default: ["Base", "MySQL", "Option", "MinIO", "LoggerFile"] + Develop: ["Base", "MySQL", "Option", "Sms", "AliOSS", "LoggerZinc"] + Slim: ["Base", "Sqlite3", "LocalOSS", "LoggerFile"] + Base: ["Zinc", "Redis", "Alipay",] Option: ["SimpleCacheIndex"] Sms: "SmsJuhe" SmsJuhe: @@ -75,17 +75,20 @@ LocalOSS: # 本地文件OSS存储配置 Secure: False Bucket: paopao Domain: 127.0.0.1:8008 +Database: # Database通用配置 + LogLevel: 2 + TablePrefix: p_ MySQL: # MySQL数据库 Username: paopao Password: paopao Host: db:3306 DBName: paopao - TablePrefix: p_ Charset: utf8mb4 ParseTime: True - LogLevel: 2 MaxIdleConns: 10 MaxOpenConns: 30 +Sqlite3: # Sqlite3数据库 + Path: data/sqlite3/paopao-ce.db Redis: Host: redis:6379 Password: diff --git a/go.mod b/go.mod index 9a84bf6e..099f16fd 100644 --- a/go.mod +++ b/go.mod @@ -32,8 +32,9 @@ require ( google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/resty.v1 v1.12.0 - gorm.io/driver/mysql v1.3.2 - gorm.io/gorm v1.23.2 + gorm.io/driver/mysql v1.3.4 + gorm.io/driver/sqlite v1.3.4 + gorm.io/gorm v1.23.4 gorm.io/plugin/dbresolver v1.1.0 gorm.io/plugin/soft_delete v1.1.0 ) diff --git a/go.sum b/go.sum index 70483ca9..9db000c0 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,9 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -511,8 +512,9 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.3 h1:j7a/xn1U6TKA/PHHxqZuzh64CdtRc7rU9M+AvkOl5bA= github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -1229,17 +1231,17 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9oI= -gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/sqlite v1.1.3 h1:BYfdVuZB5He/u9dt4qDpZqiqDJ6KhPqs5QUqsr/Eeuc= +gorm.io/driver/mysql v1.3.4 h1:/KoBMgsUHC3bExsekDcmNYaBnfH2WNeFuXqqrqMc98Q= +gorm.io/driver/mysql v1.3.4/go.mod h1:s4Tq0KmD0yhPGHbZEwg1VPlH0vT/GBHJZorPzhcxBUE= gorm.io/driver/sqlite v1.1.3/go.mod h1:AKDgRWk8lcSQSw+9kxCJnX/yySj8G3rdwYlU57cB45c= +gorm.io/driver/sqlite v1.3.4 h1:NnFOPVfzi4CPsJPH4wXr6rMkPb4ElHEqKMvrsx9c9Fk= +gorm.io/driver/sqlite v1.3.4/go.mod h1:B+8GyC9K7VgzJAcrcXMRPdnMcck+8FgJynEehEPM16U= gorm.io/gorm v1.20.1/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.11/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.23.0/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.2 h1:xmq9QRMWL8HTJyhAUBXy8FqIIQCYESeKfJL4DoGKiWQ= -gorm.io/gorm v1.23.2/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.4 h1:1BKWM67O6CflSLcwGQR7ccfmC4ebOxQrTfOQGRE9wjg= +gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/plugin/dbresolver v1.1.0 h1:cegr4DeprR6SkLIQlKhJLYxH8muFbJ4SmnojXvoeb00= gorm.io/plugin/dbresolver v1.1.0/go.mod h1:tpImigFAEejCALOttyhWqsy4vfa2Uh/vAUVnL5IRF7Y= gorm.io/plugin/soft_delete v1.1.0 h1:LcE4L+GD29RkkMLxMYHpT4wQCJ/9945FsdU/mHGaDuE= diff --git a/internal/conf/conf.go b/internal/conf/conf.go index 827bbce1..8024421e 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -9,7 +9,9 @@ import ( var ( loggerFileSetting *LoggerFileSettingS loggerZincSetting *LoggerZincSettingS - mySQLSetting *MySQLSettingS + databaseSetting *DatabaseSetingS + mysqlSetting *MySQLSettingS + sqlite3Setting *Sqlite3SettingS redisSetting *RedisSettingS features *FeaturesSettingS @@ -48,7 +50,9 @@ func setupSetting(suite []string, noDefault bool) error { "SmsJuhe": &SmsJuheSetting, "LoggerFile": &loggerFileSetting, "LoggerZinc": &loggerZincSetting, - "MySQL": &mySQLSetting, + "Database": &databaseSetting, + "MySQL": &mysqlSetting, + "Sqlite3": &sqlite3Setting, "Zinc": &ZincSetting, "Redis": &redisSetting, "JWT": &JWTSetting, diff --git a/internal/conf/db.go b/internal/conf/db.go index 0cc6799c..6a3872bc 100644 --- a/internal/conf/db.go +++ b/internal/conf/db.go @@ -1,12 +1,12 @@ package conf import ( - "fmt" "time" "github.com/go-redis/redis/v8" "github.com/sirupsen/logrus" "gorm.io/driver/mysql" + "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" @@ -22,39 +22,47 @@ func newDBEngine() (*gorm.DB, error) { newLogger := logger.New( logrus.StandardLogger(), // io writer(日志输出的目标,前缀和日志包含的内容) logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: mySQLSetting.LogLevel, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: time.Second, // 慢 SQL 阈值 + LogLevel: databaseSetting.LogLevel, // 日志级别 + IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: false, // 禁用彩色打印 }, ) - s := "%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local" - db, err := gorm.Open(mysql.Open(fmt.Sprintf(s, - mySQLSetting.UserName, - mySQLSetting.Password, - mySQLSetting.Host, - mySQLSetting.DBName, - mySQLSetting.Charset, - mySQLSetting.ParseTime, - )), &gorm.Config{ + config := &gorm.Config{ Logger: newLogger, NamingStrategy: schema.NamingStrategy{ - TablePrefix: mySQLSetting.TablePrefix, + TablePrefix: databaseSetting.TablePrefix, SingularTable: true, }, - }) - if err != nil { - return nil, err } - db.Use(dbresolver.Register(dbresolver.Config{}). + plugin := dbresolver.Register(dbresolver.Config{}). SetConnMaxIdleTime(time.Hour). SetConnMaxLifetime(24 * time.Hour). - SetMaxIdleConns(mySQLSetting.MaxIdleConns). - SetMaxOpenConns(mySQLSetting.MaxOpenConns)) + SetMaxIdleConns(mysqlSetting.MaxIdleConns). + SetMaxOpenConns(mysqlSetting.MaxOpenConns) + + var ( + db *gorm.DB + err error + ) + if CfgIf("MySQL") { + logrus.Debugf("use MySQL as db dsn: %s", mysqlSetting.Dsn()) + if db, err = gorm.Open(mysql.Open(mysqlSetting.Dsn()), config); err == nil { + db.Use(plugin) + } + } else if CfgIf("Sqlite3") { + logrus.Debugf("use Sqlite3 as db path: %s", sqlite3Setting.Path) + db, err = gorm.Open(sqlite.Open(sqlite3Setting.Path), config) + } else { + logrus.Debugf("use default of MySQL as db dsn: %s", mysqlSetting.Dsn()) + if db, err = gorm.Open(mysql.Open(mysqlSetting.Dsn()), config); err == nil { + db.Use(plugin) + } + } - return db, nil + return db, err } // setupDBEngine 暂时只支持MySQL diff --git a/internal/conf/settting.go b/internal/conf/settting.go index 90ec2c3e..29ca6198 100644 --- a/internal/conf/settting.go +++ b/internal/conf/settting.go @@ -1,6 +1,7 @@ package conf import ( + "fmt" "strings" "time" @@ -77,19 +78,26 @@ type ZincSettingS struct { Password string } +type DatabaseSetingS struct { + TablePrefix string + LogLevel logger.LogLevel +} + type MySQLSettingS struct { UserName string Password string Host string DBName string - TablePrefix string Charset string ParseTime bool - LogLevel logger.LogLevel MaxIdleConns int MaxOpenConns int } +type Sqlite3SettingS struct { + Path string +} + type MinIOSettingS struct { AccessKey string SecretKey string @@ -251,3 +259,14 @@ func (f *FeaturesSettingS) CfgIf(expression string) bool { } return false } + +func (s *MySQLSettingS) Dsn() string { + return fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local", + s.UserName, + s.Password, + s.Host, + s.DBName, + s.Charset, + s.ParseTime, + ) +}