支持循环天表的自动分表。有些业务场景需要分表,但是没有DDL权限,无法自动建表,此时需要提前建立好31张表,重复使用,避免自动建表和删表。

This commit is contained in:
大石头 2025-01-03 23:40:06 +08:00
parent 45a836177a
commit 5f7546162a
2 changed files with 38 additions and 8 deletions

View File

@ -487,7 +487,7 @@ public class ShardTests
};
var start = "2023-12-31".ToDateTime();
var end = DateTime.Today;
var end = start.AddDays(300);
var fi = policy.Field;
var where = fi >= start & fi < end;
@ -526,18 +526,48 @@ public class ShardTests
{
var policy = new TimeShardPolicy(Log2._.CreateTime, Log2.Meta.Factory)
{
TablePolicy = "{0}_{1:yyyyMM}",
Step = TimeSpan.FromDays(31),
TablePolicy = "{0}_{1:yyyyMMdd}",
Step = TimeSpan.FromDays(1),
};
// 起止都是整数日期末尾加1天
var start = "2024/7/25 00:00:00".ToDateTime();
var start = "2024/7/30 00:00:00".ToDateTime();
var end = start.AddDays(3);
var fi = policy.Field;
var where = fi.Equal(start);
//var where = fi.Equal(start);
var where = fi.Between(start, end);
var shards = policy.Shards(where);
Assert.NotNull(shards);
Assert.Equal(1, shards.Length);
Assert.Equal("Log2_202407", shards[0].TableName);
Assert.Equal(4, shards.Length);
Assert.Equal("Log2_20240730", shards[0].TableName);
Assert.Equal("Log2_20240731", shards[1].TableName);
Assert.Equal("Log2_20240801", shards[2].TableName);
Assert.Equal("Log2_20240802", shards[3].TableName);
}
[Fact]
public void Shards()
{
var policy = new TimeShardPolicy(Log2._.CreateTime, Log2.Meta.Factory)
{
TablePolicy = "{0}_{1:dd}",
Step = TimeSpan.FromDays(1),
};
// 起止都是整数日期末尾加1天
var start = "2024/7/30 00:00:00".ToDateTime();
var end = start.AddDays(3);
var fi = policy.Field;
//var where = fi.Equal(start);
var where = fi.Between(start, end);
var shards = policy.Shards(where);
Assert.NotNull(shards);
Assert.Equal(4, shards.Length);
Assert.Equal("Log2_30", shards[0].TableName);
Assert.Equal("Log2_31", shards[1].TableName);
Assert.Equal("Log2_01", shards[2].TableName);
Assert.Equal("Log2_02", shards[3].TableName);
}
}

View File

@ -50,7 +50,7 @@ public class UserTests
var user = new User { Name = Rand.NextString(64) };
var ex = Assert.Throws<ArgumentOutOfRangeException>(() => user.Insert());
Assert.Equal("Name", ex.ParamName);
Assert.Equal("[Name/名称]长度限制50字符[ID=0] (Parameter 'Name')", ex.Message);
Assert.Equal("[Name/名称@User]长度限制50字符[ID=0] (Parameter 'Name')", ex.Message);
}
[Fact]