SqlSugarClient 代码优先建表, 根据给定的实体类,创建SQL语句, 之后创建MySQL表

news/2024/11/15 22:57:57/文章来源:https://www.cnblogs.com/lmp138/p/18548830
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);}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目冲刺11.15

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第七篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

Latex 安装

使用的开发环境是 VSCode. Latex 在编译时需要用到宏包. 宏包到底是啥? 有啥作用? 从何处下载? Latex 软件的安装:texlive: 一次性下载所有的宏包. 磁盘需求较大, 约 7 ~ 8 G.miktex: 仅下载必要的宏包, 编译时补充下载宏包. 磁盘需求较小, 约几百 M.清华大学开源软件镜像站…

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:…

Windows程序设计指南

Windows程序设计指南“到Petzold的书中找找”——仍然是解决Windows程式开发各种疑难杂症时的灵丹妙药。在第五版的《Windows程式开发设计指南》中,作者身为倍受敬重的WindowsPioneerAward(Windows开路先锋奖)得主,依据最新版本Windows作业系统,以可靠的取材资料校定这一本…

Windows高级调试

Windows高级调试中文版文档摘要: 本书《Windows高级调试》主要讲解Windows高级调试技术和工具,包括调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础…

iman——冲刺日志(第四天)

又一阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成了行程概览地图中标记连线与探索功能的删除与添加。 3 2前端 郭剑敏 实现了地图标点的驾车路线绘制功能。 3 1前端 王梓铭 优化了主页与导航栏布局,提…

1.11--06:月度开销

http://noi.openjudge.cn/ch0111/06/月度开销题目传送门思路 给定连续N天的开销,需要将这些天分成M个财政周期,使得开销最多的财政周期的开销尽可能少。 首先,我们可以确定一个财政周期的长度l,即将N天平均分成M个财政周期。这样每个财政周期的长度就是N/M。 然后,我们需要…

SIM Jacker攻击分析

攻击者使用普通手机发送特殊构造的短信即可远程定位目标,危害较大。sim卡的使用在手机上的使用非常普遍,所以一旦SIM卡上出现什么问题就会造成非常大的影响。在19年的报告纰漏中,在全球估算共有10亿设备的sim卡容易遭受SIMJacker攻击,这篇也是比较浅显的对整个攻击进行分析…

shell动态修改yml配置实例

yq安装https://github.com/mikefarah/yq/tree/master每个yq版本支持的选项参数都不一样修改Dockerfile[root@instance base-tlog-test]# vi Dockerfile FROM 192.168.30.113/library/java:latest ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &am…

『模拟赛』NOIP2024加赛5

Rank 反向挂分大王A. 暴力操作(opt) 签,但是没有人签。 都想到了二分和更新 c 值,但是 c 多多少少没更到最优。 首先还是调和级数预处理,倒序取 min。然后考虑到超过 \(m\) 的也有可能产生更小的代价,因此 \(\mathcal{O(n)}\) 枚举一遍找到最小的 \(j\) 使 \(i\times j\g…

[Moectf2024 ezMaze]

去壳 分析:迷宫分析10 * a2 - 10:Y (a1 - 1) / 8 :X 表示按字节处理迷宫迷宫以十六进制压缩,但迷宫是80 * 56的二进制迷宫 dump下来保存,转二进制,用bin(maze[2:]).zfill(8) 脚本(bfs): from collections import deque maze = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…

有理逼近AAA算法

用于有理逼近的AAA算法,可以有效防止伪极点现象用于有理逼近的AAA算法The AAA Algorithm for Rational Approximation, Yuji Nakatsukasa, Olivier Ste, and Lloyd N. Trefethen, SIAM Journal on Scientific Computing 2018 40:3, A1494-A1522, https://doi.org/10.1137/16M1…