首页 > 数据库 >sqlsugar 分表

sqlsugar 分表

时间:2024-07-02 14:58:13浏览次数:1  
标签:Name entityInfo var 分表 public sqlsugar string

一、首字母分表

  1. 安装 hyjiacan.pinyin4net
    > dotnet add package hyjiacan.pinyin4net --version 4.1.1
    
  2. 创建分表服务
    /// <summary>
    /// Apricot 分表
    /// </summary>
    public class ApricotSplitTableService : ISplitTableService
    {
       /// <summary>
       /// sqlsugar 默认分表
       /// </summary>
       /// <param name="db"></param>
       /// <param name="EntityInfo"></param>
       /// <param name="tableInfos"></param>
       /// <returns></returns>
       public List<SplitTableInfo> GetAllTables(ISqlSugarClient db, EntityInfo EntityInfo, List<DbTableInfo> tableInfos)
       {
          List<SplitTableInfo> result = new List<SplitTableInfo>();
          foreach (var item in tableInfos)
          {
                if (item.Name.Contains("apricot")) //区分标识如果不用正则符复杂一些,防止找错表
                {
                   SplitTableInfo data = new SplitTableInfo()
                   {
                      TableName = item.Name //要用item.name不要写错了
                   };
                   result.Add(data);
                }
          }
          return result.OrderBy(it => it.TableName).ToList();//打断点看一下有没有查出所有分表
       }
    
       /// <summary>
       /// sqlsugar 默认分表
       /// </summary>
       /// <param name="db"></param>
       /// <param name="entityInfo"></param>
       /// <param name="splitType"></param>
       /// <param name="entityValue"></param>
       /// <returns></returns>
       public object GetFieldValue(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object entityValue)
       {
          var column = entityInfo.Columns.FirstOrDefault(it => it.PropertyInfo.GetCustomAttribute<SplitFieldAttribute>() != null);
    
          var value = column.PropertyInfo.GetValue(entityValue, null);
    
          return value;
       }
    
       /// <summary>
       /// sqlsugar 默认分表
       /// </summary>
       /// <param name="db"></param>
       /// <param name="entityInfo"></param>
       /// <returns></returns>
       public string GetTableName(ISqlSugarClient db, EntityInfo entityInfo)
       {
          return entityInfo.DbTableName;
       }
    
       /// <summary>
       /// sqlsugar 默认分表
       /// </summary>
       /// <param name="db"></param>
       /// <param name="entityInfo"></param>
       /// <param name="type"></param>
       /// <returns></returns>
       public string GetTableName(ISqlSugarClient db, EntityInfo entityInfo, SplitType type)
       {
          return entityInfo.DbTableName;//目前模式少不需要分类(自带的有 日、周、月、季、年等进行区分)
       }
    
       /// <summary>
       /// 自定义分表
       /// </summary>
       /// <param name="db"></param>
       /// <param name="entityInfo"></param>
       /// <param name="splitType"></param>
       /// <param name="fieldValue"></param>
       /// <returns></returns>
       public string GetTableName(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object fieldValue)
       {
          return $"{entityInfo.DbTableName}_{GetPinyin($"{fieldValue}")}"; //根据值按首字母
       }
       
       /// <summary>
       /// 获取拼音首字母
       /// </summary>
       /// <param name="data"></param>
       /// <returns></returns>
       private static char GetPinyin(string data)
       {
          return Pinyin4Net.GetPinyin(data, PinyinFormat.None).FirstOrDefault();
       }
    }
    
  3. 创建表实体
    // 指定自定义分表
    [SplitTable(splitType: SplitType._Custom01, CustomSplitTableService = typeof(ApricotSplitTableService))]
    public class Apricot
    {
       [SugarColumn(IsPrimaryKey = true)]
       public long Id { get; set; }
    
       // [SplitField] //标识一下分表字段
       public string Name { get; set; }
    
       // 分表字段、并且不存库
       [SplitField, SugarColumn(IsIgnore = true)]
       public string SplitName { get; set; }
    
       public DateTime CreateTime { get; set; }
    }
    
  4. 写入数据 自动分表
    using var scope = app.Services.CreateScope();
    
    var context = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
    
    var datas = new List<Apricot>()
       {
          new Apricot()
          {
             CreateTime = DateTime.Now,
             Name="测试",
             SplitName ="测试"
          } ,
          new Apricot()
          {
             CreateTime = DateTime.Now,
             Name="分表",
             SplitName ="分表"
          },
          new Apricot()
          {
             CreateTime = DateTime.Now,
             Name="数据",
             SplitName ="数据"
          }
       };
    
    List<long> ids = context.CopyNew().Insertable(datas).SplitTable().ExecuteReturnSnowflakeIdList();
    
  5. 分表查询
    using var scope = app.Services.CreateScope();
    
    var context = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
    
    var apricot = await context.Queryable<Apricot>().Where(p => p.Name == "测试").SplitTable().ToListAsync();
    
  6. 参考

标签:Name,entityInfo,var,分表,public,sqlsugar,string
From: https://www.cnblogs.com/study10000/p/18279867

相关文章

  • 库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践
    1问题域业务发展的初期,我们的数据库架构往往是单库单表,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治之的思想:分库分表,通过分库分表应对存系统读写性能瓶颈和存储瓶颈;分库分表帮我们解决问题的同时......
  • SqlSugar操作Sqlite数据库
    SqlSugar操作Sqlite数据库SqlSugar官网.netcore和.net5/.net6/.net7/.net8/.net9/.net10  安装SqlSugarCore。netframework4.6+   安装SqlSugar。以下代码都在一个SqlSugarMethod类中。获得数据库对象:  这里要注意的是FilePath路径为生成程序的目录\bin\Debug\ne......
  • 分库分表的介绍及常见实现方法,ShardingSphere实现分库分表示例
    分库分表的介绍分库分表是一种常见的数据库架构优化手段,主要用于解决单一数据库或单一表的数据量过大、并发读写过高的问题。下面详细介绍几种实现分库分表的方法:垂直拆分(分库)垂直分库:按照业务模块将表拆分到不同的数据库中,每个数据库负责一部分业务。优点:不同业务的数据......
  • JAVA八股文面试必会-基础篇-3.3 分库分表
    1.什么是分库分表?分库分表,是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案,所谓"分库分表",根本就不是一件事儿,而是三件事儿,他们要解决的问题也都不一样。这三个事儿分别是"只分库不分表”、"只分表不分库"、以及"既分库又分表"。分库分库主要解决的......
  • SqlSugar基础用法
    SQLSugar是什么**1.轻量级ORM框架,专为.NETCORE开发人员设计,它提供了简单、高效的方式来处理数据库操作,使开发人员能够更轻松地与数据库进行交互2.简化数据库操作和数据访问,允许开发人员在C#代码中直接操作数据库,而不需要编写复杂的SQL语句3.支持多种数据库,包括但不限于MYSQ......
  • ShardingSphere + Mysql,实现分库分表、读写分离,并整合 SpringBoot
    软件版本Docker:26.1.3Mysql:8.4.0ShardingSphere:5.5.0 分库分表1.Docker创建两个Mysqlservices:mysql:image:mysql:8.4.0ports:-"3306:3306"environment:MYSQL_ROOT_PASSWORD:abc123volumes:-./data:/var/lib/mysql......
  • 分库分表方案
    文章目录分库分表设计思路hash取模和范围方案最终方案采用hash取模和rang范围两者相结合分库分表设计思路首先分库分表有两种方式,一种是垂直拆分,一种是水平拆分。垂直拆分垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库,就是一微服务......
  • 基于SpringCloudAlibaba+Sharding-JDBC的微服务的分库分表设计
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • 使用sharding-jdbc做分库分表记录
       项目中要使用分库分表来解决上亿数据的存储以及查询问题,最开始使用的是硬编码的方式,根据用户id的hash值做分表,保证同一个用户落在一张表里面。后面有同事说使用shardingsphere有现成的解决方案,于是转成了使用shardingsphere。 首先引入shardingjdbc的pom依赖  ......
  • sqlSugar 使用原生模式链接数据库
    usingSystem.Reflection;usingzhulongxu_webapi_pro.Tools;namespacezhulongxu_webapi_pro.Services{///<summary>///初始化数据库///</summary>publicstaticclassInitDataBaseService{publicstaticvoidInitDataBase......