Files
Rogee 885df8aabf
Some checks failed
build quyun / Build (push) Failing after 1m26s
fix: commit
2025-12-22 10:48:26 +08:00

141 lines
3.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package postgres
import (
"fmt"
"strconv"
"time"
"go.ipao.vip/atom/container"
"go.ipao.vip/atom/opt"
"gorm.io/gorm/logger"
)
const DefaultPrefix = "Database"
func DefaultProvider() container.ProviderContainer {
return container.ProviderContainer{
Provider: Provide,
Options: []opt.Option{
opt.Prefix(DefaultPrefix),
},
}
}
type Config struct {
Username string
Password string
Database string
Schema string
Host string
Port uint
SslMode string
TimeZone string
Prefix string // 表前缀
Singular bool // 是否开启全局禁用复数true表示开启
MaxIdleConns int // 空闲中的最大连接数
MaxOpenConns int // 打开到数据库的最大连接数
// 可选连接生命周期配置0 表示不设置)
ConnMaxLifetimeSeconds uint
ConnMaxIdleTimeSeconds uint
// 可选GORM 日志与行为配置
LogLevel string // silent|error|warn|info默认info
SlowThresholdMs uint // 慢查询阈值毫秒默认200
ParameterizedQueries bool // 占位符输出,便于日志安全与查询归并
PrepareStmt bool // 预编译语句缓存
SkipDefaultTransaction bool // 跳过默认事务
// 可选DSN 增强
UseSearchPath bool // 在 DSN 中附带 search_path
ApplicationName string // application_name
}
func (m Config) GormSlowThreshold() time.Duration {
if m.SlowThresholdMs == 0 {
return 200 * time.Millisecond // 默认200ms
}
return time.Duration(m.SlowThresholdMs) * time.Millisecond
}
func (m Config) GormLogLevel() logger.LogLevel {
switch m.LogLevel {
case "silent":
return logger.Silent
case "error":
return logger.Error
case "warn":
return logger.Warn
case "info", "":
return logger.Info
default:
return logger.Info
}
}
func (m *Config) checkDefault() {
if m.MaxIdleConns == 0 {
m.MaxIdleConns = 10
}
if m.MaxOpenConns == 0 {
m.MaxOpenConns = 100
}
if m.Username == "" {
m.Username = "postgres"
}
if m.SslMode == "" {
m.SslMode = "disable"
}
if m.TimeZone == "" {
// m.TimeZone = "Asia/Shanghai"
}
if m.Port == 0 {
m.Port = 5432
}
if m.Schema == "" {
m.Schema = "public"
}
}
func (m *Config) EmptyDsn() string {
// 基本 DSN
// dsnTpl := "host=%s user=%s password=%s port=%d dbname=%s sslmode=%s TimeZone=%s"
// m.checkDefault()
// base := fmt.Sprintf(dsnTpl, m.Host, m.Username, m.Password, m.Port, m.Database, m.SslMode, m.TimeZone)
dsnTpl := "host=%s user=%s password=%s port=%d dbname=%s sslmode=%s"
m.checkDefault()
base := fmt.Sprintf(dsnTpl, m.Host, m.Username, m.Password, m.Port, m.Database, m.SslMode)
// 附加可选参数
extras := ""
if m.UseSearchPath && m.Schema != "" {
extras += " search_path=" + m.Schema
}
if m.ApplicationName != "" {
extras += " application_name=" + strconv.Quote(m.ApplicationName)
}
return base + extras
}
// DSN connection dsn
func (m *Config) DSN() string {
// 基本 DSN
dsnTpl := "host=%s user=%s password=%s dbname=%s port=%d sslmode=%s"
m.checkDefault()
base := fmt.Sprintf(dsnTpl, m.Host, m.Username, m.Password, m.Database, m.Port, m.SslMode)
// 附加可选参数
extras := ""
if m.UseSearchPath && m.Schema != "" {
extras += " search_path=" + m.Schema
}
if m.ApplicationName != "" {
extras += " application_name=" + strconv.Quote(m.ApplicationName)
}
return base + extras
}