[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最合理,不仅满足开发需要,(随时加字段),还避免了字段改变而导致的数据丢失风险;
反向工程如此神奇的功能,你想到了什么高端用法吗?我们将在数万级分表分库章节等你!
系列教程
NewLife.XCode教程系列[2019版]
- 增删改查入门。快速展现用法,代码配置连接字符串
- 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
- 实体类详解。数据类业务类,泛型基类,接口
- 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
- 反向工程。自动建立数据库数据表
- 数据初始化。InitData写入初始化数据
- 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
- 脏数据。如何产生,怎么利用
- 增量累加。高并发统计
- 事务处理。单表和多表,不同连接,多种写法
- 扩展属性。多表关联,Map映射
- 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
- 数据层缓存。Sql缓存,更新机制
- 实体缓存。全表整理缓存,更新机制
- 对象缓存。字典缓存,适用用户等数据较多场景。
- 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
- 实体工厂。元数据,通用处理程序
- 角色权限。Membership
- 导入导出。Xml,Json,二进制,网络或文件
- 分表分库。常见拆分逻辑
- 高级统计。聚合统计,分组统计
- 批量写入。批量插入,批量Upsert,异步保存
- 实体队列。写入级缓存,提升性能。
- 备份同步。备份数据,恢复数据,同步数据
- 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
- 大数据分析。ETL抽取,调度计算处理,结果持久化
[NewLife.XCode]反向工程(自动建表建库大杀器)的更多相关文章
- SQL Server建库-建表-建约束
----------------------------------------SQL Server建库-建表-建约束创建School数据库------------------------------ ...
- 使用T-sql建库建表建约束
为什么要使用sql语句建库建表? 现在假设这样一个场景,公司的项目经过测试没问题后需要在客户的实际环境中进行演示,那就需要对数据进行移植,现在问题来了:客户的数据库版本和公司开发阶段使用的数据库不兼容 ...
- mysql建表建索引
建表: CREATE TABLE `sj_projects` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL ...
- 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)
一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary --默认属于primary主文件组,可省略(--数 ...
- mysql 建库建表建用户
1.创建数据库 create database school; 2.使用数据库 Use school; 3.创建用户 create user jame@localhost identified by ...
- mysql 一个典型的数据库建表建用户过程
cmd 命令不接 ";" mysql 命令后接 ";" 1.以管理员身份登录mysql mysql -u root –p 2.选择mysql数据库 use my ...
- SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL
SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...
- 测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作
flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy 安装 传统的sql建表建字段 通过flask-S ...
- 【平台开发】— 4.mysql建库建表
本想着把前端脚手架run起来了,然后就可以借着登录来捋一下前后端交互的过程.但是后端导入JPA的时候就发现了,还没有数据库. 既然是本着学习的目的,那咱也不想只在后端写死返回的数据,要做就做全套. 一 ...
随机推荐
- 微信小程序开发之搞懂flex布局4——Main Axis
Main Axis——主轴 当flex-direction设置为row或row-reverse时,主轴的方向为水平方向.此时flex item为行内级元素. 当flex-direction设置为col ...
- tomcat连接常用数据库的用法
一.用于数据库连接的术语: JDBC:(Java database connectivity)是基于java数据访问技术的一个API通过客户端访问服务器的数据库,是一个面向关系型数据库并提供一种方法查 ...
- 浅谈nodejs和php
现在,Web开发公司和开发人员可以选择多种技术栈来构建Web应用程序.早期网络发展,不同的技术被用于前端和后端开发.但是,随着Node.js的发布,布局发生了变化,因为它允许开发人员使用 JavaSc ...
- Jmeter+ant集成接口测试报告
一.jdk1.8下载及环境配置 1.1 下载地址 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-download ...
- vue中v-model动态生成的实例详解
每一行有一个input和一个select,其中行数是根据服务器返回的json数据动态变化的.那么问题来了,我们要怎样动态生成v-model? <template> <div> ...
- git遇到的问题-- Another git process seems to be running in this repository
执行git add .时,报错 fatal: Unable to create '/Users/lily/ForWork/forReBaomai/bm-fe/.git/index.lock': Fil ...
- pycharm License server激活
2018-11-15 pycharm License server激活有效:https://idea.ouyanglol.com/
- Java 异常与反射 总结
1.异常 异常,简单来说,就是一个程序执行过程中发生的不正常情况的事件.它发生在程序的运行期间,干扰了正常的指令流程.如果没有处理异常,那么出现异常之后,程序会停止运行.异常分为运行异常和非运行异常. ...
- 【adb】执行adb devices 设备offline
解决办法: 1.执行adb kill-server,在执行adb devices 2.重启手机 ---------------------------------------------------- ...
- WordPress数据结构分析
WordPress仅仅用了10 个表:wp_comments, wp_links, wp_options, wp_postmeta, wp_posts, wp_term_relationships, ...