|
@@ -70,8 +70,11 @@ func (sm *ShardingManager) GetCurrentTableName(baseTableName string) string {
|
|
|
|
|
|
// GetQueryTableNames 获取查询需要的所有表名
|
|
|
func (sm *ShardingManager) GetQueryTableNames(baseTableName string, start, end *time.Time) []string {
|
|
|
- if start == nil || end == nil {
|
|
|
- // 如果没有指定时间范围,默认查询最近3个月的表
|
|
|
+ if start == nil && end == nil {
|
|
|
+ // 如果都为nil,返回所有可能的表名(用于显示所有数据)
|
|
|
+ return sm.getAllPossibleTableNames(baseTableName)
|
|
|
+ } else if start == nil || end == nil {
|
|
|
+ // 如果只有一个为nil,默认查询最近3个月的表
|
|
|
now := time.Now()
|
|
|
defaultStart := now.AddDate(0, -2, 0) // 前2个月
|
|
|
defaultEnd := now
|
|
@@ -80,6 +83,23 @@ func (sm *ShardingManager) GetQueryTableNames(baseTableName string, start, end *
|
|
|
return sm.strategy.GetTableNamesByRange(baseTableName, *start, *end)
|
|
|
}
|
|
|
|
|
|
+// getAllPossibleTableNames 直接从数据库中查找所有符合模式的表名
|
|
|
+func (sm *ShardingManager) getAllPossibleTableNames(baseTableName string) []string {
|
|
|
+ // 使用数据库查找所有符合模式的表,而不是基于时间推测
|
|
|
+ // 查找基础分表模式: log_202408, log_202407 等
|
|
|
+ basePattern := fmt.Sprintf("%s_\\d{6}", baseTableName) // 例如: log_202408
|
|
|
+ baseTables := sm.findTablesByPattern(nil, basePattern)
|
|
|
+
|
|
|
+ // 查找序列分表模式: log_202408_01, log_202408_02 等
|
|
|
+ sequencePattern := fmt.Sprintf("%s_\\d{6}_\\d+", baseTableName) // 例如: log_202408_01
|
|
|
+ sequenceTables := sm.findTablesByPattern(nil, sequencePattern)
|
|
|
+
|
|
|
+ // 合并结果
|
|
|
+ allTables := append(baseTables, sequenceTables...)
|
|
|
+
|
|
|
+ return allTables
|
|
|
+}
|
|
|
+
|
|
|
// EnsureTableExists 确保表存在,不存在则创建
|
|
|
func (sm *ShardingManager) EnsureTableExists(ctx context.Context, db *gorm.DB, tableName string, model interface{}) error {
|
|
|
// 检查表是否存在
|