在近期的项目中存在多种类型的数据库,为了让同一套代码在不同的数据库环境下切换使用,通过修改后端代码使得服务部署后能够通过修改配置文件实现数据库的切换。
已现有的ABP框架为例,数据库相关配置位于基础设施层EntityFrameworkCore项目中。
修改使用数据库的方法,因为默认是只能使用一种数据库,要修改数据库类型就需要改代码。通过判断语句让程序初始化是自动选择数据库驱动。
public static void Configure(DbContextOptionsBuilder<ConstructionDbContext> dbContextOptions,string connectionString,bool isDm) { /* This is the single point to configure DbContextOptions for PersonnelDbContext */ if (isDm) { dbContextOptions.UseDm(connectionString); } else { dbContextOptions.UseMySql(connectionString); } }
public ConstructionDbContext CreateDbContext(string[] args) { var builder = new DbContextOptionsBuilder<ConstructionDbContext>(); var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder()); bool isDm = configuration["ConnectionStrings:IsDameng"] == "true"?true:false;//是否为达梦数据库 string connectionString = configuration.GetConnectionString(RunGoConsts.DefaultConnectionStringName);//默认数据库连接字符串 if (isDm) { connectionString = configuration.GetConnectionString(RunGoConsts.ExtendConnectionStringName);//达梦数据库连接字符串 } DbContextOptionsConfigurer.Configure(builder,connectionString,isDm); return new ConstructionDbContext(builder.Options); }
读取配置文件关于数据库的选项,在启动时初始化数据库仓储。
public IServiceProvider ConfigureServices(IServiceCollection services) { bool isDm = _appConfiguration["ConnectionStrings:IsDameng"] == "true" ? true : false;//是否为达梦数据库 //Configure DbContext services.AddAbpDbContext<ConstructionDbContext>(options => { DbContextOptionsConfigurer.Configure(options.DbContextOptions, options.ConnectionString, isDm); }); ////// }
当IsDameng为true时,服务使用Extend项作为数据库连接字符串(此处为达梦数据库);当IsDameng为false时,服务使用Default项作为数据库连接字符串;
"ConnectionStrings": { "IsDameng": "true", "Default": "Server=192.168.199.221; Database=Construction_dev; User ID=root; Password=admin@123;port=3306", "Extend": "Server=192.168.199.2:5236;UID=CONSTRUCTION;Password=admin@123;" },注意:使用数据库切换的前提是要安装MySQL和达梦数据库的驱动。
在上面步骤中,代码层面的数据库切换已经准备好了,下面就是数据库层面的切换了。但在实际操作过程中,会出现各种不同类型的问题。
对于已有的MySQL数据库,一般使用达梦官方提供的数据迁移工具进行迁移。在安装了达梦数据库的计算机上可以找到。
按照引导步骤一步步操作就能完成数据库迁移。
常见问题有以下几项 :
DM数据迁移工具默认使用的是MySQL 5.0的驱动,经常会出现连接失败的问题。通过下载较高版本的MySQL驱动解决。
驱动包下载
MySQL数据库默认是在一个表空间下的,一个数据库实例中包含多个库;而达梦数据库中是按照模式区分的。所以迁移时MySQL数据库中的所有库中的表都会出现在源对象中,需要手动选择相应的表迁移至达梦数据库的指定模式中。
当源对象较多时,只能通过查找功能搜索相应的表进行迁移。
不同数据库中表名的规则也不同,比如MySQL默认小写,SQL Server区分大小写,达梦则是默认大写。MySQL数据库迁移到达梦数据库后表名会全部变为大写,运行后端服务就会报错“不存在相应的表”。
使用迁移工具时可以勾选“保持对象名大小写”,确保表名不会发生变化。
数据库切换后,同样的代码使用SQLServer没有问题,使用MySQL没有问题,使用达梦DM数据库却不行。这类问题出现的最多,原因也是五花八门,也比较难排除。但总体来讲不是达梦数据库本身的问题,更多的是开发人员自身和代码的问题。
问题还在持续发现,后续会不断完善更新。开发人员也要严格规范自己的代码,把细节做好,才能避免出现更多问题。