using SqlSugar;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text; namespace DDD
{
/// <summary>
///
/// SqlSugarClient 代码优先建表
/// 根据给定的实体类,创建SQL语句, 之后创建MySQL表
///
/// 优势:
/// 随便给一个C# 实体类,就可以建表。
/// 无需给实体类的属性添加额外的属性。如:繁琐的 [SugarColumn(IsPrimaryKey =true)]等。
///
/// 用法:
/// CreateMySQLTableCodeFirst.CreateTablesBySQL(DB, typeof(YourType1),typeof(YourType2));
///
/// 后续做法:
/// 如果对字段的类型不满意,可以用 HeidiSQL 软件修改表的字段和类型
/// 添加字段、修改字段名称、添加索引,也用该软件。
///
/// by lmp 2024.11.15
///
/// </summary>
public class CreateTableCodeFirstOnMySQL
{
/// <summary>
/// 创建表
/// </summary>
/// <param name="db"></param>
/// <param name="entityTypes"></param>
public static void CreateTablesBySQL(SqlSugarClient db, params Type[] entityTypes)
{
foreach (Type entityType in entityTypes)
{
string sql = GetCreateTableSQLOfType(entityType);
db.Ado.ExecuteCommand(sql);
Log.Msg($"创建表完成 【{entityType.Name}】");
}
} /// <summary>
/// 生成建表SQL语句
/// </summary>
/// <param name="entityType"></param>
/// <returns></returns>
public static string GetCreateTableSQLOfType(Type entityType)
{
string tableName = entityType.Name; string sqlPropertys = CreateOther(entityType); StringBuilder sb = new StringBuilder(); sb.Append($@"
CREATE TABLE `{tableName}` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
{sqlPropertys},
PRIMARY KEY (`Id`) USING BTREE
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
");
return sb.ToString();
} /// <summary>
/// 创建除了Id 以外的其他类型
/// </summary>
/// <param name="entityType"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
private static string CreateOther(Type entityType)
{
PropertyInfo[] piArray = entityType.GetProperties(); // 类型T的所有公共属性 List<string> items = new List<string>(); foreach (PropertyInfo pi in piArray)
{
string columnName = pi.Name; if (columnName.ToUpper() == "ID") // 排除Id ,因为已经创建了语句
{
continue;
} Type tp = pi.PropertyType; if (tp == typeof(DateTime) || tp == typeof(DateTime?))
{
items.Add($"`{columnName}` DATETIME NULL ");
} else if (tp == typeof(float) || tp == typeof(float?))
{
items.Add($"`{columnName}` DOUBLE NULL DEFAULT 0 ");
} else if (tp == typeof(double) || tp == typeof(double?))
{
items.Add($"`{columnName}` DOUBLE NULL DEFAULT 0 ");
}
else if (tp == typeof(decimal) || tp == typeof(decimal?))
{
items.Add($"`{columnName}` DOUBLE NULL DEFAULT 0 ");
}
else if (tp == typeof(int) || tp == typeof(int?))
{
items.Add($"`{columnName}` INT NULL DEFAULT 0 ");
}
else if (tp == typeof(long) || tp == typeof(long?))
{
items.Add($"`{columnName}` BIGINT NULL DEFAULT 0 ");
} else if (tp == typeof(bool) || tp == typeof(bool?))
{
items.Add($"`{columnName}` TINYINT(1) NULL DEFAULT 0 ");
}
else if (tp == typeof(string))
{
items.Add($"`{columnName}` VARCHAR(255) NULL DEFAULT NULL ");
}
else if (tp == typeof(byte[]))
{
items.Add($"`{columnName}` LONGBLOB NULL DEFAULT NULL ");
}
else
{
throw new Exception($"{entityType.Name} 中{columnName}的未知类型:" + tp);
}
} return string.Join(", \r\n", items); }
}
}

SqlSugarClient 代码优先建表, 根据给定的实体类,创建SQL语句, 之后创建MySQL表的更多相关文章

  1. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  2. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  3. 使用sql语句复制一张表

    如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newbiao like chengjibiao(老表名); 第二步:将老表中的值复制到 ...

  4. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  5. 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库

    将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...

  6. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  7. 使用sql语句备份一张表

    如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newtable like oldtable; 第二步:将老表中的值复制到新标中. in ...

  8. 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

    为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...

  9. 使用SQL语句清空数据库所有表的数据

    使用SQL语句清空数据库所有表的数据 近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进 ...

  10. sql 语句 获取某张表某列字段最短的某几行数据

    sql 语句 获取某张表某列字段最短的某几行数据 SELECT C_name,C_code FROM Catalog where LEN(C_code)=LEN((SELECT top 1 C_cod ...

随机推荐

  1. druid数据库连接池在使用中遇到的一些问题和说明

    get connection timeout retry : 1 2024-02-06 11:18:26.364 ERROR 23752 --- [eate-1838225797] com.aliba ...

  2. mvn install 设定下载的依赖保存的地址

    mvn clean install -P jdk-1.8 -Dmaven.repo.local=/xxxx/repository

  3. Kafka原理剖析之「Topic创建」

    一.前言 Kafka提供了高性能的读写,而这些读写操作均是操作在Topic上的,Topic的创建就尤为关键,其中涉及分区分配策略.状态流转等,而Topic的新建语句非常简单 bash kafka-to ...

  4. 万字长文全面详解现代C++智能指针:原理、应用和陷阱

    现代C++智能指针详解:原理.应用和陷阱 智能指针是C++11引入的新特性.本篇文章详细介绍了C++智能指针的原理.应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr.s ...

  5. DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning for Noisy Time Series》(时间序列、对比学习、去噪)

    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI 2024出来了,找了几篇论文看,首先这是第一篇. 论文:Denoising-Aware Contrastive Le ...

  6. Angular 18+ 高级教程 – Angular CLI

    前言 这篇会列出我开发中常用的 command. 并给予一些简单的说明 Command Format 先了解一下几个简单的 command 格式: 缩写 shortform 这个是完整版 ng gen ...

  7. RxJS 系列 – 概念篇

    前言 很长一段时间没有写 Angular 了 (哎...全栈的命),近期计划又要开始回去写了,于是就开始做复习咯. 我的复习是从 JS > TS > RxJS > Angular,与 ...

  8. ASP.NET Core – Web API JSON Patch

    前言 依据 Restful 的方式, 修改 resource 要用 PUT, 然后把完整的 resource 发出去, resource 的所有信息都将被更新. 但很多时候我们希望只做局部更新, 而且 ...

  9. QT6 Widgets深入剖析

    QT6 Widgets深入剖析 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费100 ...

  10. Java 动态编译工具 Janino 和 Liquor 差别

    如果你只要 Java7 及以下的语法支持,建议 Janino.如果要你想更全的 Java8.Java11.Java17.Java21 等语法,可以选 Liquor. 1.它们相同的地方 提供的相似的能 ...