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

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

时间:2024-11-15 22:45:22浏览次数:1  
标签:实体类 建表 创建 entityType tp columnName typeof items NULL

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);

        }
    }
}
 

 

标签:实体类,建表,创建,entityType,tp,columnName,typeof,items,NULL
From: https://www.cnblogs.com/lmp138/p/18548830

相关文章

  • CSS入门(主要讲解选择器,CSS的创建,背景,文本)
    一.理解id和class选择器id选择器CSS中id选择器以"#"来定义。以下的样式规则应用于元素属性id="para1":#para1{text-align:center;color:red;}注意:ID属性不要以数字开头,数字开头的ID在Mozilla/Firefox浏览器中不起作用。class选择器class选择器在......
  • 【DEV-C++创建分文件项目】【零基础 小白 可上手的清晰易懂教程!】
    DEV-C++创建项目【DEV-C++创建项目】1、首先创建一个项目文件夹2、再点击创建的文件夹,在里面创建几个分类文件3、打开DEV-C++,然后点击【新建项目】4、选择Basic中的【ConsoleApplication】,选择【C++】,再写入自己要建立的【项目名称】5、创建完毕后将其放入到刚刚创建......
  • 泷羽sec-shell脚本创建执行与变量使用
    shell脚本创建vimxx.sh可以利用#!/bin/bash、#!/bin/dash、#!/bin/sh这三种其实不管用哪种脚本解释器最后调用的还是这个dash比如ls-lbin/sh发现调用的还是dash执行方法一./xx.sh #默认没有执行权限chmod+xxx.sh方法二shxx.shbashxx.shdashxx.sh......
  • JPA 注解只能用于标记实体类及其与数据库表之间的关系吗?对数据库表并没有什么实际影响
    JPA注解的主要作用确实是用于标记实体类及其与数据库表之间的关系,但它们在数据库层面上也会产生实际影响。具体来说,JPA注解不仅用于对象-关系映射(ORM),而且会影响数据库的结构和行为。以下是一些关键点,说明JPA注解如何对数据库表产生实际影响:1.生成数据库结构使用JPA时,可以......
  • React系列一:创建React项目
    文章目录NPM安装React检查是否安装Node.js和npm检查拉取仓库是否使用国内并设置国内使用create-react-app快速构建React开发环境项目结构src下的index.js和index.csssrc下的App.js和App.cssApp.js挂载新组件NPM安装React检查是否安装Node.js和npmnode-vnpm-v......
  • MongoDB创建只读用户并授权指定集合的查询权限
    MongoDB创建只读用户并授权指定集合的查询权限创建测试数据usetestdbdb.test_t.insertOne({id:1,name:'zhangsan'});db.test_t.insertOne({id:2,name:'lisi'});db.test_t1.insertOne({id:1,name:'zhangsan'});db.test_t1.insertOne({id:2,name:'lisi'}......
  • IDEA 如何手动创建spring boot工程
    步骤创建Maven工程引入依赖提供启动类一,创建maven工程newModules选择Maven起名选择骨架quickstart检查maven工程坐标一般不用改二,引入依赖坐标打开pom文件1,让当前工程继承一个副工程<parent><groupId>org.springframework.boot</groupId><artifactId>spring-......
  • linux c --- 创建子进程 system() 与 exec() 的区别
    功能差异:system()函数的主要功能是执行一个系统命令,这个命令由用户通过命令行参数传递给system()函数。system()函数会创建一个新的进程来执行这个命令,并等待这个进程执行完毕后才返回。因此,system()函数主要用于执行简单的、可以通过命令行传递参数的系统命令。exec()函数则是......
  • 线程状态转换?创建线程的几种方式?线程如何停止?
    新建(New)NEW:初始状态,线程被构建,但是还没有调用start()方法。可运行(Runnable)RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。也就是可能正在运行,也可能正在等待CPU时间片。包含了操作系统线程状态中的Running和Ready。阻塞(Blocking)等待获取一个排它......
  • EBS:物料搬运单查看人限制(创建人栏位)
    Appliesto:OracleInventoryManagement-Version:11.5.9to12.0.0-Release:11.5to12.2Informationinthisdocumentappliestoanyplatform.FORM:INVTOMAI.FMB-ResponseCenterSymptomsIntheMoveOrdersform(INVTOMAI),whenusingtheFindfunction,the......