mysql 分表问题,自定义分表格式xxxx_yyyyMM 返回

SqlSugar 沟通中
2 142

我在配置分表上使用xxx_ {yyyyMM} ,mssql上使用没问题,但如果多库的话,mysql 一直查询都是--no table

 [SplitTable(SplitType.Month, typeof(yyyyMMService))]

 [SugarTable("xxx_{yyyyMM}", "xxx表")]




yyyyMMService 用的就是论坛内的


 因为 XXX_{yyyyMM} 跟实际表名不一致  mysql 全是小写 xxxx_{yyyymm}  返回表名就是小写


如果在 链接位置配置  直接转小写,表能找到,但  _{yyyyMM} 又成问题了

  ConfigureExternalServices = new ConfigureExternalServices()

  {

      EntityNameService = (c, p) =>

      {


          //if (item.DbType != DbType.SqlServer)

          //{

          //    p.DbTableName = p.DbTableName?.ToLower();

          //}

      },


热忱回答2

  • --no table

    是你查询没找到表


    ,检查自定义分表的 重几个方法,获取的表名是否正确。

    0 回复
  • 试了 代码中是 XXX_{yyyyMM} , mysql 查询出来是  xxx_202604

    所以在 这个就查不到匹配不上(下发有注释)

    public class yyyyMMService : ISplitTableService
            {
                public List<SplitTableInfo> GetAllTables(ISqlSugarClient db, EntityInfo EntityInfo, List<DbTableInfo> tableInfos)
                {
                    List<SplitTableInfo> result = new List<SplitTableInfo>();
                    foreach (var item in tableInfos)

                    {

                             // EntityInfo.DbTableName 获取到时配置好的 XXX_{yyyyMM}

                        var tableName = EntityInfo.DbTableName.Replace("_{yyyyMM}","");

                          // item.Name 是  xxx_202604

                        if (EntityInfo.DbTableName.Contains("_{yyyyMM}") &&item.Name.Contains(tableName))// MySpliteTest_202204  这种格式的表
                        {
                            SplitTableInfo tableInfo = new SplitTableInfo();
                            tableInfo.TableName =item.Name;
                            var value = Regex.Match(item.Name, @"\d{6}$").Value;
                            if(value!=null)
                            {
                            value=value.Insert(4, "-");
                            tableInfo.Date = Convert.ToDateTime(value + "-01");
                            //tableInfo.String = null;  Time table, it doesn't work
                            //tableInfo.Long = null;  Time table, it doesn't work
                            result.Add(tableInfo);
                            }
                        }
                    }
                    return result;
                }
     
                public object GetFieldValue(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object entityValue)
                {
                    var splitColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyInfo.GetCustomAttribute<SplitFieldAttribute>() != null);
                    if (splitColumn == null)
                    {
                        return db.GetDate();
                    }
                    else
                    {
                        var value = splitColumn.PropertyInfo.GetValue(entityValue, null);
                        return value;
                    }
                }
     
                public string GetTableName(ISqlSugarClient db, EntityInfo EntityInfo)
                {
                    return EntityInfo.DbTableName.Replace("{yyyyMM}", DateTime.Now.ToString("yyyyMM")) ;
                }
     
                public string GetTableName(ISqlSugarClient db, EntityInfo EntityInfo, SplitType type)
                {
                    return EntityInfo.DbTableName.Replace("{yyyyMM}", DateTime.Now.ToString("yyyyMM"));
                }
     
                public string GetTableName(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object fieldValue)
                {
                    return entityInfo.DbTableName.Replace("{yyyyMM}",Convert.ToDateTime(fieldValue).ToString("yyyyMM"));
                }
            }


    0 回复