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果糖网

相关推荐
LuminousCPP8 分钟前
数据结构-二叉树(五):查找、销毁与前序序列建树
c语言·数据结构·笔记·二叉树
Nontee8 小时前
MySQL 插入冲突了怎么办?两种处理方式入门笔记
数据库·笔记·mysql
浔溺8 小时前
al+大数据每日学习笔记26
笔记·学习
老当益壮梁奶奶9 小时前
Linux软件编程学习笔记(七):线程分离与线程间通信详解
linux·c语言·c++·笔记·学习
sel_99 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
zzm62810 小时前
《SIGIR 2018论文精读|深度学习点击序列模型:对搜索页面点击行为进行序列建模》
笔记·深度学习·推荐系统·论文精读
常驻客栈11 小时前
B-深入理解计算机系统第3版之第8章:异常控制流
笔记·学习·常驻客栈·深入理解计算机系统·学习笔记‘’
Seraphina3611 小时前
记一次实验:利用路径分隔符进行网页缓存欺骗
经验分享·笔记·安全·网络安全·缓存
AOwhisky11 小时前
Linux 网络服务架设学习笔记(第五期)——Web 服务(上篇):Apache HTTP Server——从静态到动态
linux·运维·服务器·笔记·学习·云计算·apache
摇滚侠13 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端