SqlSugarClient 代码优先建表, 根据给定的实体类,创建SQL语句, 之后创建MySQL表
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表的更多相关文章
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
- 使用sql语句复制一张表
如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newbiao like chengjibiao(老表名); 第二步:将老表中的值复制到 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库
将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- 使用sql语句备份一张表
如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newtable like oldtable; 第二步:将老表中的值复制到新标中. in ...
- 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题
为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...
- 使用SQL语句清空数据库所有表的数据
使用SQL语句清空数据库所有表的数据 近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进 ...
- sql 语句 获取某张表某列字段最短的某几行数据
sql 语句 获取某张表某列字段最短的某几行数据 SELECT C_name,C_code FROM Catalog where LEN(C_code)=LEN((SELECT top 1 C_cod ...
随机推荐
- AvaloniaChat-v0.0.2:兼容智谱AI 快速使用指南
智谱AI介绍 北京智谱华章科技有限公司(简称"智谱AI")致力于打造新一代认知智能大模型,专注于做大模型的中国创新.公司合作研发了中英双语千亿级超大规模预训练模型GLM-130B, ...
- Element Plus使用
目录 Element Plus快速入门 常用组件 Element:是饿了么团队研发的,基于 Vue 3,面向设计师和开发者的组件库. 组件:组成网页的部件,例如 超链接.按钮.图片.表格.表单.分页条 ...
- 【YashanDB知识库】YashanDB的JDBC/OCI驱动如何设置字符编码
问题现象 Oracle.Mysql数据库链接串,JDBC驱动连接串可以指定客户端的编码格式: jdbc:mysql://hostname:port/database_name?useUnicode=t ...
- tarjan—算法的神(一)
本篇包含 tarjan 求强连通分量.边双连通分量.割点 部分, tarjan 求点双连通分量.桥(割边)在下一篇. 伟大的 Robert Tarjan 创造了众多被人们所熟知的算法及数据结构,最著名 ...
- Go runtime 调度器精讲(三):main goroutine 创建
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 回顾下 上一讲 的内容.主线程 m0 蓄势待发,准备干活.g0 为 m0 提供了执行环境,P 和 m0 绑定,为 m0 提供活,也就是 goro ...
- 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,在第37条中建议 用EnumMap替换序数索引,为什么? EnumSet 在EffectiveJava中的第 36条中 ...
- MyBatisPlus——代码生成器
代码生成器 快速生成各项代码 步骤 创建Generator类,并创建main方法 创建代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); ...
- .Net技术栈
一.后端 1. 框架 C# 异步多线程 委托 事件 标准事件模式 泛型 特性 反射 Linq Lambda Expression表达式树 PLinq IO文件操作 XML操作 .Net IOC/DI依 ...
- SpringBoot 集成 LDAP
LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...
- QQ或者微信可以放昵称的超好看的符号
☪︎⋆ ✯ ⛈ •ᴗ• •ᴥ• ◔.̮◔ ᕱ ᕱ ⸝⸝· ᴥ ·⸝⸝ ʕ·͡ˑ·ཻʔ ʕ•̫͡•ོʔ ˃̣̣̥᷄⌓˂̣̣̥᷅ °꒰'ꀾ'꒱° ⋆ᶿ̵᷄ ˒̼ ᶿ̵᷅⋆ ˙ϖ˙ ⚝ ︎ .˗ˏˋ♡ˎˊ˗ ...