

sqlsugar 对接mysql分表。sqlsguar分表注意事项。分表思路,通过日期获取分表表名等

官方文档:
https://www.donet5.com/Home/Doc?typeId=1201
sqlsguar分表注意事项
注意一:需要有一个分表字段,插入的时候需要对这个字段赋值
官方例子上面的:
[SplitField] //分表字段 在插入的时候会根据这个字段插入哪个表,在更新删除的时候用这个字段找出相关表
public DateTime CreateTime { get; set; }
插入的时候需要对这个字段赋值,不然他不知道向那个表插入。虽然不赋值他会有一个默认的日期:1900-01-01 00:00:00
注意二:主键类型
如果使用雪花id,主键类型要使用long
mysql对应的主键类型是:bigint(64)
id bigint(64) PRIMARY key,
但是要注意如果最开始主键类型写错了,写成了int,然后去执行插入失败了,会提示:MySql.Data.MySqlClient.MySqlException:“Out of range value for column ‘id’ at row 1” 就是超长了,这个时候不能去修改数据库的表,修改成多长都是报这个错。因为第一次插入的时候他已经生成了一个表了,而且主键是int类型的,长度明显不够。
这个时候应该把生成的这个表删除掉,然后重新执行就行了,因为使用了分表插入的时候,插入的表其实不是我们在数据库里边创建的表,而是他内部的逻辑在控制,要注意这点。
通过日期获取分表名
虽然sqlsugar有根据时间直接获取分表表名的方法
GetTableName(data.CreateTime);//根据时间获取表名
还有根据一个区间获取的
SplitTable(beginDate,endDate)
但是有时候我们的sql比较复杂的,需要自己手写sql的,所以我们需要自己封装一个方法,通过日期获取分表表明的方法,其实也非常简单。根据时间就可以去找到分表了。比如要查询2022-5的数据要查询的肯定就是20220101这张表(根据年分表的情况),月都不用管,只取年,然后格式化一下转字符串就可以得到分表了,只查询一个表很方便,又不是一个区间。
/// <summary>
/// 根据时间获取分表的名称
/// 根据时间就可以去找到分表了。比如要查询2022-5的数据要查询的肯定就是20220101这张表,月都不用管,只取年,然后格式化一下转字符串就可以得到分表了,只查询一个表很方便,又不是一个区间
/// </summary>
/// <param name="_dateTime"></param>
/// <returns></returns>
public static string GetSplitTableNameByDate(DateTime _dateTime)
{
//根据传过来的时间取到年,只取年即可,因为分表是根据年分表的
DateTime dateTime = new DateTime(_dateTime.Year, 1, 1);
string splitTableName = dateTime.ToString("yyyyMMdd");
return splitTableName;
}
测试代码如下:
DateTime dateTime = DateTime.Parse("2022-6-6");
string tableName = "statisticsdata_month_" + DateTimeTools.GetSplitTableNameByDate(dateTime);
Console.WriteLine(tableName);
string tableName2 = "statisticsdata_month_" + DateTimeTools.GetSplitTableNameByDate(DateTime.Parse("2021-09-24"));
Console.WriteLine(tableName2);
效果如下,可以正确的得到分表的表名:
贴一下分表名称使用的规则
[SugarTable("statisticsdata_month_{year}{month}{day}")]
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)