专栏首页智能大石头[NewLife.XCode]反向工程(自动建表建库大杀器)

[NewLife.XCode]反向工程(自动建表建库大杀器)

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 656+)

大杀器

反向工程是XCode的大杀器,区别于其它ORM的最强功能!

通俗理解:基于XCode开发的应用,无需数据库安装脚本,连接字符串指向哪一台哪一种数据库,系统就自动在上面建库建表!

正式定义:基于实体类的表结构信息,在连接字符串指定的目标数据库上自动执行建库建表、添删改字段、创建索引等操作,支持各种数据库!

应用系统首次启动完成的时候,也是自动建表建库并初始化完成的时候。

反向工程是XCode数万级分表的主要倚仗!

创建控制台项目,从Nuget引用NewLife.XCode

创建实体类,模型如下(可参考前面几章来生成实体类):

测试代码:

执行日志:

自始至终,我们没有编写SQL脚本,没有去数据库创建数据表。

代码写完就跑起来,测试通过就部署到正式库。

从日志来看,程序自动下载SQLite驱动,因为我们并没有指定实体类使用哪一种数据库,XCode自动给我们配置了SQLite。(上一章连接字符串部分有讲解)

加一行代码把数据库指向MySql:

执行日志:

同样的首先下载MySql驱动,(当然也可以自己通过nuget引用)。

首次连接数据库时,库名指定School报错,因为根本就不存在这个库。

因此,XCode切换到系统库,开始创建数据库School,并创建数据表和索引。这里完全是MySql语法,不同于上面的SQLite建表语句。

感兴趣的同学,还可以试试Oracle和SqlServer等数据库。

正向工程

正向工程就是从数据库读取表结构信息,生成模型信息。

我们来试试写几行代码读取上面创建的数据表:

执行日志:

从上面可以看到,读取dal.Tables得到了这个连接的所有表结构信息,输出为Xml时,跟前面用来创建实体类的模型文件极为相似。

其实这就是一个模型文件,只是为了生成实体类的模型文件多增加了几个属性而已。

新生命码神工具XCoder,(https://github.com/NewLifeX/XCoder),其中的数据建模工具,可以导出各种数据库的表结构信息,正是基于dal.Tables来实现。

正向工程由3个基本接口构成:

  • IDataTable。数据表接口,dal.Tables就是IDataTable集合,包括名称、描述等
  • IDataColumn。数据列接口,每张数据表有多个数据列,包括名称、类型、长度、描述等
  • IDataIndex。数据索引接口,每张数据表没有或者有多个索引,索引指定包括哪些字段 ,是否唯一

反向工程

有了IDataTable,我们就可以主动控制数据表结构。

DAL.SetTables(IDataTable[] tables);

这是反向工程高级用法,实际日常工作中用不到,各个实体类加载时,将会逐个连接进行反向工程检查,正是调用该方法。

给上面的数据模型,增加一个字段Code和对应索引:

跑起来:

程序自动为我们添加了字段,以及创建了索引!

前面的几个SHOW,就是XCode的正向工程,取得数据库表结构,然后跟实体类结构对比,不相同时执行反向操作。

反向工程设置

大家还记得上一章系统设置中提到的Migration吗?

XCode.config和连接字符串中都支持这个设置。

可用设置项如下:

  • Off 关闭,不执行反向工程
  • ReadOnly 只读不执行,异步执行反向工程检查,对比后生成变更DDL写入日志
  • On 打开,仅新建,默认设置。新建表、增加字段、创建索引等可以执行,禁止修改字段长度类型,禁止删除字段,以免造成数据丢失
  • Full 完全,修改删除。除了新建表、增加字段、创建索引外,还可以修改字段长度类型、删除字段等,极其危险,慎用

反向工程设计于2008年,10多年经验表明,默认On最合理,不仅满足开发需要,(随时加字段),还避免了字段改变而导致的数据丢失风险;

反向工程如此神奇的功能,你想到了什么高端用法吗?我们将在数万级分表分库章节等你!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • XCode最佳实践之最佳数据类型

    与其它ORM框架相比,XCode拥有最强的多数据库正向反向工程,暂时还没有发现能在这点上超于XCode的,哈哈! 但是,XCode的多数据库反向工程,也是有代...

    大石头
  • XCode之第一次亲密接触

    首先得说明,本教程仅用于让第一次接触XCode的朋友了解XCode,不具有任何别的实际意义,真正的项目也不会采取这种开发方式,而采用更先进、快速而强大的开发方式...

    大石头
  • 充血模型的ORM能做什么?——ORM组件XCode(十八般武艺)

    ORM组件XCode(十八般武艺) 之前,XCode总是若隐若现,耐性好的同学想知道它还有啥特点,沉不住气的则认为不过是CURD耳! XCode开发模式是灵魂,...

    大石头
  • ONOS1.3.0集群实验

    1.环境准备与实验内容 本次集群安装准备了四台虚拟机: VM1:oxp@192.168.0.71 VM2:oxp@192.168.0.72 VM3:oxp@19...

    SDNLAB
  • 想要成为VIP等级玩家吗 先来学学继承

    当年学继承的时候 到处都是 A啊B啊继承啊,不仅看的头皮发麻,还容易被绕晕,你们写教材的大佬举个轻松愉快的例子会怀孕吗?啊啊啊???

    用户5745563
  • 一个不可思议的MySQL慢查分析与解决

    前言 开发需要定期的删除表里一定时间以前的数据,SQL如下 mysql > delete from testtable WHERE biz_date <= '2...

    程序猿DD
  • class文件字节码解析

    本篇文章将介绍 .class 文件的结构,通过一个简单的例子认识 .class 文件。 首先写一个java文件(本人选择在Android平台,主要是接下来一篇...

    提莫队长
  • 【快学springboot】7.使用Spring Boot Jpa

    Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 ...

    Happyjava
  • 数据仓库中如何使用索引

    数据仓库的索引是个棘手的问题。如果索引太多,数据插入很快但是查询响应就会很慢。如果太多索引,数据导入就很慢并且数据存储空间更大,但是查询响应更快。数据库中索引的...

    用户1217611
  • 《T-SQL查询》读书笔记Part 3.索引的基本知识

    索引优化是查询优化中最重要的一部分,索引是一种用于排序和搜索的结构,在查找数据时索引可以减少对I/O的需要;当计划中的某些元素需要或是可以利用经过排序的数据时,...

    Edison Zhou

扫码关注云+社区

领取腾讯云代金券