[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]反向工程(自动建表建库大杀器)相关推荐
- xcode修改时间后就要重新编译_[NewLife.XCode]反向工程(自动建表建库大杀器)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- Mysql - Mysql的建表建库
目录 Mysql5.7官方参考文档:MySQL :: MySQL 5.7 Reference Manual SQL语言说明文档: 数据库里存在的包含关系: Mysql建表建库: 1.Mysql如何建库 ...
- linux shell脚本执行sql语句建表建库
linux shell脚本执行sql语句建表建库 1. 创建sql脚本 2. 创建shll脚本 1. 创建sql脚本 创建contract_ddl.sql -- 创建数据库contract_user ...
- SQL server数据库手动建库建表建约束,代码建库建表,数据库备份
目录 一,手动建库 二,sql代码建库 三,手动建表以及建立约束 四,sql代码建表以及建立约束 五,数据库备份 一,手动建库 右键数据库-->新建数据库 填写数据库名称-->确定 如果数 ...
- sqlserver建库建表建约束,删库删表删约束的示例总结
1.创建一个数据库catedb,保存在本地D盘下面的DB中,主数据文件的初始大小为5MB,最大为200MB,增长率为10%,日志文件的初始大小为3MB,无限制增长,其增长率为2MB,请使用sql语句检 ...
- SQL Server学习1(建数据库,建表,建约束)
--建数据库NetBarDB IF exists(select * from sys.sysdatabases where [NAME]='NetBarDB') drop database N ...
- mysql 建表建索引
Mysql建表与索引使用规范整理 一,设计表规范: MySQL建表,字段需设置为非空,需设置字段默认值: MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL: MySQL建表,如果 ...
- [NewLife.XCode]实体队列(多线程生产的大数据集中保存)
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- 高级数据库,建库,建表,建约束
use master --建库,dbtime,名称time create database dbtime on primary (name = 'Time.mdf',fileName = 'E:\Ti ...
最新文章
- python如何最适合web开发中的人工智能?
- utorrent设置上传速度_utorrent下载速度慢怎样设置 utorrent常用设置图文教程
- 利用原生js 如何实现div移动?
- html设置复选框图片,css实现图片右上角添加复选框的方法
- ITK:可视化静态稀疏Whitaker 2D水平设置图层
- python实战之编码问题:中文!永远的痛
- 原码、反码、补码,计算机中所有的数都是以补码的形式存储的
- Java 格式转换:利用格式转换实现随机数生成随机 char 字母及 string 字母串
- [转载] java语言程序设计-基础篇
- Android视频开发基础(二)
- HttpServletRequest应用-获取请求参数及解决中文乱码
- WinRAR v5.90 正式版简体中文汉化特别版本
- Linux间共享文件夹
- 【SDC】StreamSets实战之路-11-基础篇- StreamSets-数据流开发- Edge数据流设计
- 基于mysql的报表工具有哪些?值得推荐的mysql报表工具
- 学习记录476@linux硬盘分区
- win10电脑外接音响没声音怎么回事?win10电脑外接音响没声音的修复方法
- 【零基础学QT】【052】CLion完美搭建Qt开发环境
- 北上资金全透视月报:上月外资大幅流入,增持周期与消费(20210107).PDF
- PCB与设备外壳接地问题
热门文章
- pta7-7旅游规划(dijkstra算法)
- Windows 7 自动更新失败导致无法进系统解决方案
- java B2B2C Springcloud多租户电子商城系统-Spring Cloud Sleuth
- 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放
- [从C到C++] 1.3 C++布尔类型(bool)
- Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上
- HUAWEI nova 青春版闪速快充,让追剧不再断电
- 实验三《实时系统的移植》 20145222黄亚奇 20145213祁玮
- 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
- angular $watch