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 ...
随机推荐
- sublime text _正则表达式01
概述 sublime 常用正则表达式 预备工作:打开sublime之后,ctrl+h,点选使用正则表达式. (\S+) :匹配所有符号外的字符 用到的地方: 小明 小黄 小红 (构造批量插入sql语句 ...
- Windows 不小心把管理员帐户弄没了怎么办
今天折腾不小心把管理员帐号的权限给改没了,重启之后很多操作做不了.解决方法如下: Windows + R 打开运行,或者打开资源管理器,输入 control userpasswords2 命令打开用户 ...
- ELK快速部署(踩坑记录、常见报错解决)及常用架构讲解
ELK = Elasticserach + Logstash + kibana(包含但不仅限于) 简介: Elasticsearch:分布式搜索和分析引擎,具有高可伸缩.高可靠和易管理等特点.基于 A ...
- C# WinForm避免程序重复启动,限制程序只能运行一个实例【转】
记录一下,原文:https://blog.csdn.net/xggbest/article/details/104231935 禁止多个进程运行,当重复运行时激活以前的进程 Program.cs: u ...
- [Udemy] AWS Certified Data Analytics Specialty - 4.Analysis
Kinesis Data Analytics Analytics 可以和 Lambda集成 RANDOM_CUT_FOREST, 异常检测算法 OpenSearch = ElasticSearch O ...
- spark 先groupby 再从每个group里面选top n
import spark.implicits._ val simpleData = Seq(("James","Sales","NY",90 ...
- AT_agc057_e 题解
AT_agc057_e [0] 约定 \(r_i = \sum\limits_{j = 1}^{m}[A_{i,j}\le k]\) \(r^{'}_i = \sum\limits_{j = 1}^{ ...
- web前端常用的五种方式搭建本地静态html页面服务器
方式一:live-server live-server是一款npm工具,可以在项目目录启动一个node服务,然后直接在浏览器中预览,并且自动全局监听实时更新. 两种安装方式: 全局安装 npm i l ...
- Flutter Engage 活动精彩回顾 | 中文字幕视频
在 Flutter Engage 预告之后,无数开发者充满期待并且在社区中积极讨论交流,分享见解.今天,我们正式发布 Flutter 2.0,并在 Flutter Engage 活动 中详细介绍了这一 ...
- FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
之前的文章<利用RTMP协议构建电脑与手机的直播Demo>介绍了如何使用RTMP Streamer实现完整的RTMP直播流程,另一篇文章<利用SRT协议构建手机APP的直播Demo ...