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 ...
随机推荐
- 运行 Java 程序
Java 程序实际上就是我们编译好的 Java 类文件.运行 Java 程序就是运行 Java 类的 main 函数. 编译并运行 Java 文件 源文件: package com.example; ...
- 一文剖析TCP三次握手、四次挥手
TCP三次握手四次挥手 问题 TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠, ...
- vue 根据div id 滚动到指定view到可视视图中
<div id="name" @click="scrollToViewById('name')"> ...... </div> scro ...
- Comfyui 基础教程(一) —— 本地安装部署
前言 前面一篇文章已经介绍过,ComfyUI 和 Stable Diffusion 的关系.不清楚的朋友,看传送门 Stable Diffusion 小白的入坑铺垫 . WebUI 以及 ComfyU ...
- Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年, 日期格式
前言 以前有写过一篇了, 但很乱, 这篇就作为它的整理版吧. Leap Year 闰年 闰年是指那些有 366 天, 二月份有 29号 的年份. 比如 2020年 有 2月29日, 所以 2020 就 ...
- SQL Server – 基本操作 Table 和 Column
前言 日常都是用 EF Core 来管理 Database, 偶尔也用 Management Studio, 就是很少手写 Command. 虽然网上一拉就有很多, 但是每次写单侧都要到处找还是挺烦的 ...
- [namespace hdk] modint
template<long long mod=INT_MAX,typename T0=long long> class modint{ private: T0 x; long long p ...
- Java远程连接服务器实现文件上传下载及目录操作
详情请阅读原文 在其基础之上做了进一步的封装 <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <depende ...
- /proc/pids/io
rchar:代表自进程启动以来所读取的总字符数,包括通过缓存或直接读取的字符.单位是字节(bytes). wchar:代表自进程启动以来所写入的总字符数,包括通过缓存或直接写入的字符.单位是字节(by ...
- 3.flask 源码解析:路由
目录 一.flask 源码解析:路由 1.1 构建路由规则 1.2 werkzeug 路由逻辑 1.3 flask 路由实现 1.4 match 实现 Flask 源码分析完整教程目录:https:/ ...