当前位置: 首页 > news >正文

.net core 使用 freesql 备份结构和数据

1、获取表结构

//获取表结构,无分库
List<DbTableInfo> dbTableInfos =_freeSql.DbFirst.GetTablesByDatabase(_freeSql.DbFirst.GetDatabases()[0]);

2、序列化表结构,序列化时Table字段会循环引用,需要排除掉

//备份表结构
dbTableInfos.AsParallel().WithDegreeOfParallelism(_backupConfig.backupThread).ForAll(_ =>
{//目录名称就是表名string tempPath = Path.Combine(filePathName, _.Name);//文件string tempFilePath = Path.Combine(tempPath, _.Name);_iLogger.Info($"备份表:{_.Name},备份文件路径:{tempPath}");if (!Directory.Exists(tempPath)){Directory.CreateDirectory(tempPath);}//表结构string tableStructure = JsonHelperEx.SerializeSettingsEx(_, new Newtonsoft.Json.JsonSerializerSettings(){ContractResolver = new IgnorePropertiesContractResolver(new[] { "Table" })});//写入文件File.WriteAllText(tempFilePath, tableStructure);_iLogger.Info($"备份表结构:{_.Name},完成");
});

注:排除的代码

/// <summary>
/// 序列化时过滤某个字段
/// </summary>
public class IgnorePropertiesContractResolver : DefaultContractResolver
{private readonly HashSet<string> _ignoreProps;/// <summary>/// 构造/// </summary>/// <param name="propNamesToIgnore"></param>public IgnorePropertiesContractResolver(IEnumerable<string> propNamesToIgnore){_ignoreProps = new HashSet<string>(propNamesToIgnore);}/// <summary>/// 创建映射/// </summary>/// <param name="member"></param>/// <param name="memberSerialization"></param>/// <returns></returns>protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization){JsonProperty property = base.CreateProperty(member, memberSerialization);if (_ignoreProps.Contains(property.PropertyName)){property.ShouldSerialize = _ => false;}return property;}
}

3、备份数据

//数据
List<object> list = _freeSql.Select<object>().AsTable((_, _) => _.Name).Page(i, pageNum).ToList();
_iLogger.Info($"第 {i} 页数据:{list.Count}");
//处理数据
File.WriteAllText(tempDataFilePath, JsonConvert.SerializeObject(list, Formatting.Indented));

4、恢复表结构,将文件加载后反序列化恢复数据对象DbTableInfo

DbTableInfo dbTableInfo = JsonConvert.DeserializeObject<DbTableInfo>(json);
//处理注解
List<Attribute> attributes = new List<Attribute>();//表注解
attributes.Add(new TableAttribute() { Name = dbTableInfo.Name });
//索引注解
dbTableInfo.Uniques.ForEach(uni =>
{attributes.Add(new IndexAttribute(uni.Name, uni.Columns[0].Column.Name.ToLower(), uni.IsUnique));
});DynamicCompileBuilder dynamicCompile =_freeSql.CodeFirst.DynamicEntity(_.Name, attributes.ToArray());
//列映射
dbTableInfo.Columns.ForEach(col =>{_iLogger.Info($"备份到字段:{col.Name}");dynamicCompile = dynamicCompile.Property(col.Name, typeof(string), new ColumnAttribute{IsIdentity = col.IsIdentity,IsPrimary = col.IsPrimary,IsNullable = col.IsNullable,Position = (short)col.Position,StringLength = col.MaxLength});});//恢复结构
_freeSql.CodeFirst.SyncStructure(dynamicCompile.Build().Type);

5、恢复数据也是一样,读取文件,序列化插入表中


文章转载自:
http://atomistics.apjjykv.cn
http://arrogant.apjjykv.cn
http://beagler.apjjykv.cn
http://appearance.apjjykv.cn
http://charoseth.apjjykv.cn
http://banking.apjjykv.cn
http://budding.apjjykv.cn
http://afficionado.apjjykv.cn
http://baptistry.apjjykv.cn
http://castellar.apjjykv.cn
http://antinomianism.apjjykv.cn
http://amenability.apjjykv.cn
http://cannabis.apjjykv.cn
http://blastosphere.apjjykv.cn
http://cathomycin.apjjykv.cn
http://allonym.apjjykv.cn
http://chiasmus.apjjykv.cn
http://cheerful.apjjykv.cn
http://bribee.apjjykv.cn
http://bastardize.apjjykv.cn
http://baaroque.apjjykv.cn
http://changeroom.apjjykv.cn
http://chanterelle.apjjykv.cn
http://agazed.apjjykv.cn
http://celebrity.apjjykv.cn
http://blackguard.apjjykv.cn
http://capeskin.apjjykv.cn
http://acropolis.apjjykv.cn
http://boxful.apjjykv.cn
http://amidogroup.apjjykv.cn
http://www.dtcms.com/a/136398.html

相关文章:

  • 盈达科技:重新定义GEO优化的技术边界与商业未来​
  • Linux权限机制:用户与组权限深度剖析
  • ngx_epoll_conf_t
  • 前端VUE框架理论与应用(7)
  • 【LangChain实战】构建下一代智能问答系统:从RAG架构到生产级优化
  • Z.ai - 智谱简洁优雅的聊天新界面
  • 学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>
  • 工作记录3
  • Spark-Sql编程(三)
  • 计算机视觉——基于人工智能视觉注意力的在线广告中评估检测技术
  • 二进制求和 - 简单
  • 数据加载与保存
  • Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接
  • Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
  • Linux:Makefile
  • 数字电子技术基础(四十七)——使用Mutlisim软件来模拟74LS85芯片
  • STM32基础教程——DMA+ADC多通道
  • 【后端】【python】利用反射器----动态设置装饰器
  • 智能语音处理+1.1下载需要的库(100%实现)
  • 【Lerobot】加载本地数据LeRobotDataset数据、读取并解析parquet
  • 【c语言】深入理解指针1
  • 排序(java)
  • 任务的状态
  • 投资理财_从0到1:如何用1000元开启你的二级市场投资之旅?
  • 实战5:Python使用循环神经网络生成诗歌
  • 解决virtualbox7.1无法启动3d加速的问题
  • 大数据人工智能
  • 算法的时间复杂度
  • L37.【LeetCode题解】三数之和(双指针思想)
  • Java练习——day2(集合嵌套)