SqlSugar分表笔记

1、使用SqlSugar的分表功能时,.net要使用.net core;

我开始使用的是.net freamwork4.72,程序报异常,没能解决,换到.net core下面就正常;

2、SqlSugar自带分表支持按季度、月、周、日进行分表;

3、定义实体类对象时,主键不能是自增列、不能是int;主键支持long或guid:

cs 复制代码
    [SplitTable(SplitType.Day)]//按天分表
    [SugarTable("t温度监测表_{year}_{month}_{day}")]//3个变量必须要有,这么设计为了兼容开始按年,后面改成按月、按日
    public class TemperatureMonitor
    {
        [SugarColumn(IsPrimaryKey = true)]
        public long Id { get; set; }


        [SugarColumn(ColumnName = "监测点", ColumnDataType = "nvarchar", Length = 500)]
        public string Name { get; set; }


        [SplitField]//分表字段 ,在插入的时候会根据这个字段插入哪个表,在更新删除时用这个字段找出相关表
        [SugarColumn(ColumnName = "记录时间")]
        public DateTime CreateTime { get; set; }

        [SugarColumn(ColumnName = "外部温度")]
        public double OutSiderTemperature { get; set; }


        [SugarColumn(ColumnName = "内部温度")]
        public double InnerTemperature { get; set; }


        public override string ToString()
        {
            return $"{CreateTime.ToString("yyyy-MM-dd HH:mm:ss")}\t{Name}\t外部温度={OutSiderTemperature}\t内部温度={InnerTemperature}";
        }
    }

4、通过代码创建数据表

cs 复制代码
// 使用时
var db = new SqlSugarScope(new ConnectionConfig()
{
    ConnectionString = "connection_string",
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true,
    InitKeyType = InitKeyType.Attribute  // 从实体特性中读取主键自增列信息
});
cs 复制代码
SqlSugar.SqlSugarScope db = BllDB.GetDB(); 

//根据TemperatureMonitor类定义,创建对应的数据表
db.CodeFirst
  .SetStringDefaultLength(200) //设置字符串类型的默认长度是200
  .SplitTables() //标识分表
  .InitTables<TemperatureMonitor>(); //如果数据库里没有这张表,就会自动新建一张

5、写数据到分表中

cs 复制代码
        public static bool WriteData(List<TemperatureMonitor> monitors, out string error)
        {
            error = null;
            try
            {
                var db = BllDB.GetDB();                
                long y = db.Insertable(monitors)
                    .SplitTable() 
                    .ExecuteReturnSnowflakeId();//写入数据并返回雪花ID,并自动赋值ID列
                return true;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }
            return false;
        }

6、查询数据

cs 复制代码
//根据分表字段,确定对应的数据在哪张数据表上
TemperatureMonitor temp = new TemperatureMonitor() { CreateTime = DateTime.Parse("2014-12-03 15:35:35.983") };
var tb= db.SplitHelper(temp).GetTableNames(); //根据temp对象的分表字段信息,查询对应的数据在哪张分表上
cs 复制代码
  //查询符合条件(对象的Name==name)的所有数据 
  monitors = db.Queryable<TemperatureMonitor>()
               .Where(it => it.Name == name)//用Name属性进行过滤
               .SplitTable(tab => tab) //查询所有分表
               .ToList();
cs 复制代码
//只查询最近的一张表
var db = BllDB.GetDB();
monitors = db.Queryable<TemperatureMonitor>()
             .SplitTable(tab => tab.Take(1)) //最近一张表
             .Where(it => it.Name.Equals(name))
             .ToList();
cs 复制代码
//查询特定时间段内,Name==name的数据 
var db = BllDB.GetDB();
monitors = db.Queryable<TemperatureMonitor>()
             .SplitTable(begintime,endtime) //通过时间查询(会自动生产CreateTime的过滤并找到对应时间的表)
             .Where(it => it.Name.Equals(name))
             .ToList();

8、编辑数据

cs 复制代码
//修改Id=1808349695190372352的数据的数据值
db.Updateable<TemperatureMonitor>()
  .SetColumns(it => new TemperatureMonitor()
             {
                    OutSiderTemperature = 222,
                    InnerTemperature = 11
             })
  .Where(it => it.Id == 1808349695190372352)
  .SplitTable(tab => tab)
  .ExecuteCommand();

9、删除数据

cs 复制代码
//删除根据Id删除数据
id = 1808404206764298259;
int cnt = db.Deleteable<TemperatureMonitor>()
            .In(id)
            .SplitTable(tab => tab)
            .ExecuteCommand();
cs 复制代码
//直接根据实体集合删除 (全自动 找表插入)
 db.Deleteable(deleteList)
   .SplitTable()    //SplitTable不能少
   .ExecuteCommand();

10、补充------insert时关于PK的处理

cs 复制代码
 //雪花ID
 db.Insertable(data).SplitTable().ExecuteReturnSnowflakeIdList();//插入并返回雪花ID并且自动赋值ID   
  //服务器时间修改、不同端口用同一个代码、多个程序插入一个表都需要用到WorkId
  //保证WorkId唯一 ,程序启动时配置 SnowFlakeSingle.WorkId=从配置文件读取;
  
  
 //GUID
  db.Insertable(data).SplitTable().ExecuteCommand();//插入GUID 自动赋值 ID
   
 //大数据写入
  db.Fastest<OrderSpliteTest>().SplitTable().BulkCopy(List<OrderSpliteTest>);
 //大数据写入方式如果用到雪花ID需要手动赋值:SnowFlakeSingle.Instance.NextId()
 //部分数据库需配置 具体用法看文档: https://www.donet5.com/Home/Doc?typeId=2404
  
// sql 如下
//INSERT INTO [SplitTestTable_20190101] --如果表不存在会自动建表
//           ([Id],[Name],[CreateTime])
//     VALUES
//           (@Id,@Name,@CreateTime)

更多信息请参考官网:.NET ORM 分表组件,自动分表 - SqlSugar 5x - .NET果糖网

相关推荐
AOwhisky32 分钟前
Ceph系列第六期:Ceph 文件系统(CephFS)精讲
linux·运维·网络·笔记·ceph
萤萤七悬35 分钟前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
luck_bor2 小时前
IO流知识点笔记
java·开发语言·笔记
東雪木4 小时前
泛型、反射、注解(Spring 框架核心底层)专属复习笔记
java·windows·笔记·学习·spring
小熊猫程序猿4 小时前
Datawhale Task04 具身智能零基础入门 打卡笔记
笔记
问心无愧05134 小时前
ctf show web入门71
android·前端·笔记
light blue bird5 小时前
支组汇总主子节点工序路径图表
前端·jvm·.net·桌面端·gdi绘图
小陈phd5 小时前
多模态大模型学习笔记(四十七)——跨模态融合策略:早融合、中融合与晚融合核心解析
笔记·学习
cmes_love5 小时前
美股和港股的量化笔记-从下载逐笔tick到合成分钟
笔记·区块链
A_humble_scholar6 小时前
C++11 学习笔记:统一初始化、右值引用与完美转发
c++·笔记·学习