graph TD
A[Open<br/>打开数据库连接] --> B[Initialize Config<br/>初始化配置]
B --> C[Initialize Dialector<br/>初始化数据库方言]
C --> D[Setup Connection Pool<br/>设置连接池]
D --> E[Setup Callbacks<br/>设置回调]
E --> F[Ping Database<br/>连接数据库测试]
F --> G[DB Instance Ready<br/>数据库实例就绪]
G --> H[Session<br/>创建会话]
H --> I[Create New Session<br/>创建新会话]
I --> J[Apply Session Config<br/>应用会话配置]
G --> K[WithContext<br/>设置上下文]
K --> L[Set Context<br/>设置上下文]
G --> M[Debug<br/>调试模式]
M --> N[Set Debug Logger<br/>设置调试日志]
J --> O[Query/Exec Methods<br/>查询/执行方法]
L --> O
N --> O
O --> P[AddError<br/>添加错误]
P --> Q[Error Handling<br/>错误处理]
O --> R[Statement.Build<br/>构建语句]
R --> S[Generate SQL<br/>生成SQL]
S --> T[Execute SQL<br/>执行SQL]
T --> U[Return Results<br/>返回结果]
style A fill:#f9f,stroke:#333
style G fill:#bbf,stroke:#333
style O fill:#fbf,stroke:#333
style R fill:#bff,stroke:#333
style T fill:#bfb,stroke:#333
// 如果提供了 dialector,则初始化数据库连接 if config.Dialector != nil { err = config.Dialector.Initialize(db) if err != nil { // 如果初始化失败,则尝试关闭数据库连接 if db, _ := db.DB(); db != nil { _ = db.Close() }
// DB is not initialized, so we skip AfterInitialize // 数据库未初始化,因此跳过 AfterInitialize 回调 skipAfterInitialize = true return }
// 如果启用了错误翻译功能,但 dialector 没有实现 ErrorTranslator 接口,则记录警告 if config.TranslateError { if _, ok := db.Dialector.(ErrorTranslator); !ok { config.Logger.Warn(context.Background(), "The TranslateError option is enabled, but the Dialector %s does not implement ErrorTranslator.", db.Dialector.Name()) } } }