Oracle根据实体类比对2个数据库结构差异(demo)
源起
在公司做项目时 经常出现 实体结构和线上的数据结构以及公司开发库数据结构不匹配的问题 但是又不能直接把开发库导入到生产库因为生产库已经有实际数据了 所以弄了一个小工具
此处只做记录用 demo级 未经过优化
依赖包
DapperExtensions.NetCore
Newtonsoft.Json
Oracle.ManagedDataAccess.Core
代码
新建一个名为 DBHelper 的 core 2.1 控制台程序 加入如下代码:(ps:实体类自备 本例中的实体类通过sqlsugar生成)
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using CommonHelper;
using Dapper;
using DapperExtensions;
using Newtonsoft.Json; namespace DBHelper
{
class Program
{
//实体模型路径
public static string modelpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DAO");
//实际数据结构获取源
public const string sourcedbconnStr = "Data Source=192.168.200.151/orcl;User ID=BG;Password=1;";
//要比较的数据库连接串
public const string todbconnStr = "Data Source=192.168.200.151/orcl;User ID=BG2019;Password=1;";
//缓存数据结构对象 如果存在 则不再去sourcedb中获取结构
public static string SaveFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sourceList.txt");
//生成的添加字段语句
public static string SqlSaveFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sql.txt");
public static List<string> GetAllTableName()
{
DirectoryInfo di = new DirectoryInfo(modelpath);
var res =new List<string>();
foreach (var item in di.GetFiles("*.cs"))
{
if (!item.Name.ToLower().StartsWith("base"))
res.Add(item.Name.Replace(item.Extension,""));
}
return res;
} static void Main(string[] args)
{
//记录所有的源数据库 数据结构
List<SourceSaveList> sl = new List<SourceSaveList>();
var tableNames = GetAllTableName();
if (File.Exists(SaveFilePath))
{
using (FileStream fs = new FileStream(SaveFilePath, FileMode.Open))
{
using (StreamReader sw = new StreamReader(fs))
{
var ss = sw.ReadToEnd();
sl = JsonConvert.DeserializeObject<List<SourceSaveList>>(ss);
}
}
}
else
{
var sourceDB = new DapperHelper(sourcedbconnStr);
foreach (var item in tableNames)
{
var source =sourceDB.Conn.Query<TableColumns>(
$"select column_name,data_type,data_length from user_tab_cols where table_name='{item}'")
.ToList();
sl.Add(new SourceSaveList() { cols = source, tableName = item });
}
}
var toDB = new DapperHelper(todbconnStr);
StringBuilder sb = new StringBuilder();
foreach (var item in tableNames)
{
var source = sl.First(c => c.tableName == item).cols;
var to=
toDB.Conn.Query<TableColumns>($"select column_name,data_type,data_length from user_tab_cols where table_name='{item}'")
.ToList();
if (source.Count == to.Count) continue;
foreach (var source_column in source)
{
if (to.Any(c => c.COLUMN_NAME == source_column.COLUMN_NAME)) continue;
switch (source_column.DATA_TYPE)
{ case "DATE":
sb.Append($"alter table {item} add {source_column.COLUMN_NAME} DATE;");
break;
case "TIMESTAMP(6)":
sb.Append($"alter table {item} add {source_column.COLUMN_NAME} TIMESTAMP(6);");
break;
case "TIMESTAMP":
sb.Append($"alter table {item} add {source_column.COLUMN_NAME} TIMESTAMP({source_column.DATA_LENGTH});");
break;
default:
sb.Append($"alter table {item} add {source_column.COLUMN_NAME} {source_column.DATA_TYPE}({source_column.DATA_LENGTH});");
break;
}
sb.Append("\r\n");
}
} using (FileStream fs = new FileStream(SaveFilePath, FileMode.Create))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(JsonConvert.SerializeObject(sl));
}
}
using (FileStream fs = new FileStream(SqlSaveFilePath, FileMode.Create))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(sb.ToString());
}
} }
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;
using DapperExtensions.Mapper;
using DapperExtensions.Sql;
using Oracle.ManagedDataAccess.Client; namespace CommonHelper
{
/// <summary>
/// dapper 帮助类
/// </summary>
public class DapperHelper
{
private Database Connection = null;
public DapperHelper(string conn)
{
var orcalConn = new OracleConnection(conn);
var orcaleconfig = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new OracleDialect());
var orcaleGenerator = new SqlGeneratorImpl(orcaleconfig);
Connection = new Database(orcalConn, orcaleGenerator);
}
public IDbConnection Conn
{
get
{
return Connection.Connection;
}
} }
}
CommonHelper.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DBHelper
{
public class SourceSaveList
{
public string tableName { get; set; }
public List<TableColumns> cols { get; set; }
}
}
SourceSaveList.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DBHelper
{
public class TableColumns
{
public string COLUMN_NAME { get; set; }
public string DATA_TYPE { get; set; }
public string DATA_LENGTH { get; set; }
}
}
TableColumns
说明
1.根据本例子的配置 在bin 目录中 新建DAO目录并将具体的模型拷入
2.将代码中的sourcedbconnStr 改为开发库连接串
2.将代码中的todbconnStr 改为需要生产库连接串
3.运行后会生成 sourceList.txt 用来保存开发库数据结构 用来支持程序结构拷贝到网络无法连接的生产数据库中
如果该文件存在 则不会再去获取开发库数据结构
4.sql.txt 该文件即为缺失字段的添加语句 如果不存在该表 目前会将所有字段均生成添加语句 此情况目前需要手工处理
Oracle根据实体类比对2个数据库结构差异(demo)的更多相关文章
- 【oracle】Enterprise Manager 无法连接到数据库实例。下面列出了组件的状态---个人解决方案
最近在学习Oracle,平常喜欢使用EM查看数据库状态,但是在最近突然发现EM连接不上Oracle数据库了,不知道问题出在哪里,只好卸载了重装.但是,在使用了几天以后,又出现了相同的问题,于是下决心将 ...
- oracle 实例名和服务名以及数据库名区别
一.数据库名什么是数据库名?数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成之后, ...
- oracle所在磁盘空间不足导致了数据库异常
oracle所在磁盘空间不足导致了数据库异常.需要减小数据文件的大小来解决. 1.检查数据文件的名称和编号 select file#,name from v$datafile; 2.看哪个数据文件所占 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- MyBatis中使用实体中使用枚举,数据库中使用数值
一.简介 本文主要讲MyBatis中使用实体中使用枚举,数据库中使用数值的解决方案.正常直接使用会报错,需要添加typeHandlers在mybatis-config.xml中. 二.解决方案 如下: ...
- Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间
做易买网项目,由于对数据库插入系统时间不了解,常常遇到的问题: 1.java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配.原因:由于获取系统时间类型不对,应为sy ...
- Mybatis中resultMap的作用-解决实体类属性名和数据库字段不一致
解决实体类属性名和数据库字段不一致
- 使用jpa时,实体类有不存在数据库中的字段
使用jpa时,实体类有不存在数据库中的字段.在改属性上面加上这个注解@Transient就可以解决问题.
- Oracle 11g静默安装软件+手工创建数据库
由于是二次跳转+远程操作,无法使用图形界面,不能直接图形界面安装.采用静默安装软件+手工创建数据库的方式完成需求. 静默模式安装Oracle软件,配置监听程序 手工建库 检查各组件是否符合要求 1. ...
随机推荐
- golang kafka clinet 内存泄露问题处理
go 内存泄露 新版本服务跑上一天内存占用20g,显然是内存泄露 内存泄露的问题难在定位 技术上的定位 主要靠 pprof 生成统计文件 之前写web项目 基于net/http/pprof 可以看到运 ...
- 学习python-20191208(1)-Python Flask高级编程开发鱼书_第03章_数据与flask路由
视频01: 略...... ———————————————————————————————————————————————————————————— 视频02: 搜索需要外部数据源,也就是需要外部的A ...
- linux下如何查看服务器的硬件配置信息
性能测试时一定要确定测试环境和的硬件配置.软件版本配置,保证和线上一致,才更接近真实环境. 那么linux下如何查看服务器的硬件配置信息?? 一.查看cpu信息 1.所有信息 lscpu [root@ ...
- CF-1114C-Trailing Loves (or L'oeufs?)
题意: 输入n和m,求n!转换成m进制之后末尾有多少个0: 思路: 转换一下题意就可以看成,将n表示成x * (m ^ y),求y的最大值.^表示次方而不是异或: 这就比较好想了,将m分解质因数,对于 ...
- JAVA Web期末项目第三阶段成果
我们做的系统是一个基于Java web与MySQL的食堂点餐系统 班级: 计科二班 小组成员:李鉴宣.袁超 项目的测试 在系统部署到云服务器之前,已经在本机上进行了部署测试,通过mvn打包生成war文 ...
- 我是青年你是良品-魅蓝NOTE 2
2" title="我是青年你是良品-魅蓝NOTE 2"> 明天魅蓝即将迎来自己的新品发布会.选择儿童节的第二天后最喜爱的手机品牌.让其成为真正青年的良品. 在 ...
- git创建/合并分支/删除分支/将修改后的内容同步到GitHub远程仓库
1.创建分支并切换到刚创建的分支(这里创建新的分支来修改README.md的内容然后将创建的分支与master分支合并,最后删除创建的分支) $ git checkout -b 分支名 Switche ...
- springboot 不同类型多数据源配置及使用
springboot多数据源配置: datasource.master.jdbc=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- react动态添加多个输入框
let obj = {} result.forEach(item =>{ obj[item.eleId] = item }) setFieldsValue(obj)
- 在线做RAID命令
# 安装raid卡管理工具 wget http://10.12.30.102:10800/other/MegaCli-8.07.14-1.noarch.rpm -O /tmp/MegaCli-8.07 ...