SQLite表结构转换为MySql表(C#SqlSuga)

文章目录

  • [1 操作示例](#1 操作示例)
    • [1.1 操作数据库扩展类](#1.1 操作数据库扩展类)
    • [1.2 自定义字段结构](#1.2 自定义字段结构)

1 操作示例

csharp 复制代码
string datasource = "E:\\SQLite\\datasource.db";
var sqliteDb = datasource.GetSqlSugarClient_SQLite();

string database = "test";
string uid = "root";
string pwd = "123456";
var mysqlDb = database.GetSqlSugarClient_MySql(uid, pwd);
sqliteDb.Table_SQLite_To_MySql(mysqlDb);

1.1 操作数据库扩展类

csharp 复制代码
    /// <summary>
    /// 操作数据库扩展类
    /// </summary>
    public static class ExtensionTableStruct
    {
        /// <summary>
        /// 获取SQLite操作数据库对象
        /// </summary>
        public static SqlSugarClient GetSqlSugarClient_SQLite(this string datasource)
        {
            string connStr = $"Data Source={datasource};";
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                DbType = DbType.Sqlite,
                ConnectionString = connStr, // SQLite 文件路径
                IsAutoCloseConnection = true
            });
            return db;
        }

        /// <summary>
        /// 获取MySql操作数据库对象
        /// </summary>
        public static SqlSugarClient GetSqlSugarClient_MySql(this string database, string uid, string pwd)
        {
            var connectionString = $"server=localhost;database={database};user id={uid};password={pwd};port=3306;CharSet=utf8mb4;SslMode=None;";
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                DbType = DbType.MySql,
                ConnectionString = connectionString,
                IsAutoCloseConnection = true
            });
            return db;
        }

        /// <summary>
        /// SQLite表结构转换为MySql表结构
        /// </summary>
        /// <param name="sqliteDb"></param>
        /// <param name="mysqlDb"></param>
        public static void Table_SQLite_To_MySql(this SqlSugarClient sqliteDb, SqlSugarClient mysqlDb)
        {
            var tableNames = sqliteDb.GetSQLiteTableNames();
            foreach (var tableName in tableNames)
            {
                var columns = sqliteDb.GetSQLileTableStruct(tableName);
                mysqlDb.CreateMySqlTable(tableName, columns);
            }
        }

        /// <summary>
        /// 获取SQLite所有表名称
        /// </summary>
        private static List<string> GetSQLiteTableNames(this SqlSugarClient db)
        {
            string sql = "SELECT name FROM sqlite_master " +
                         "WHERE type='table' AND name NOT LIKE 'sqlite_%'";
            var tableDt = db.Ado.GetDataTable(sql);
            var list = new List<string>();
            foreach (DataRow row in tableDt.Rows)
            {
                list.Add(row[0].ToString());
            }
            return list;
        }

        /// <summary>
        /// 创建MySql表结构
        /// </summary>
        private static void CreateMySqlTable(this SqlSugarClient mysqlDb, string tableName, List<MyColumnInfo> columns)
        {
            List<string> fieldLines = new List<string>();
            List<string> keyLines = new List<string>();

            foreach (MyColumnInfo col in columns)
            {
                string mysqlType = "";
                if (col.Type == "integer")
                {
                    mysqlType = "INT";
                }
                else if (col.Type == "int")
                {
                    mysqlType = "INT";
                }
                else if (col.Type == "real")
                {
                    mysqlType = "DOUBLE";
                }
                else if (col.Type == "text")
                {
                    mysqlType = "LONGTEXT";
                }
                else if (col.Type == "blob")
                {
                    mysqlType = "LONGBLOB";
                }
                else if (col.Type == "datetime")
                {
                    mysqlType = "DATETIME";
                }
                else
                {
                    mysqlType = "VARCHAR(255)";
                }

                // 字段名 + 类型
                string line = "`" + col.Name + "` " + mysqlType;

                // 非空
                if (!col.IsNullable)
                {
                    line += " NOT NULL";
                }

                // 自增
                if (col.IsIdentity)
                {
                    line += " AUTO_INCREMENT";
                }

                fieldLines.Add(line);

                // 主键
                if (col.IsPrimaryKey)
                {
                    keyLines.Add("PRIMARY KEY (`" + col.Name + "`)");
                }
            }

            // 拼接所有语句
            List<string> allLines = new List<string>();
            allLines.AddRange(fieldLines);
            allLines.AddRange(keyLines);

            string sql = "CREATE TABLE IF NOT EXISTS `" + tableName + "` (\n  "
                         + string.Join(",\n  ", allLines)
                         + "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

            // 执行建表
            mysqlDb.Ado.ExecuteCommand(sql);
        }

        /// <summary>
        /// 获取SQLite表结构
        /// </summary>
        private static List<MyColumnInfo> GetSQLileTableStruct(this SqlSugarClient db, string tableName)
        {
            var list = new List<MyColumnInfo>();

            var dt = db.Ado.GetDataTable($"PRAGMA table_info([{tableName}])");

            foreach (DataRow row in dt.Rows)
            {
                var col = new MyColumnInfo
                {
                    Name = row["name"].ToString(),
                    Type = row["type"].ToString().ToLower(),
                    IsPrimaryKey = row["pk"].ToString() == "1",
                    IsNullable = row["notnull"].ToString() == "0",
                };

                // SQLite 只有 INTEGER 主键才是自增
                col.IsIdentity = col.IsPrimaryKey && col.Type == "integer";

                list.Add(col);
            }
            return list;
        }
    }

1.2 自定义字段结构

csharp 复制代码
/// <summary>
/// 自定义字段结构
/// </summary>
public class MyColumnInfo
{
    public string Name { get; set; }    // 字段名
    public string Type { get; set; }    // 字段类型
    public bool IsPrimaryKey { get; set; } // 是否主键
    public bool IsNullable { get; set; }   // 是否可空
    public bool IsIdentity { get; set; }   // 是否自增
}
相关推荐
有梦想的小何1 小时前
库存快照报表升级实战:SQL 窗口函数 + 分区管理(MySQL 8.0)
数据库·sql·mysql
承渊政道2 小时前
【MySQL数据库学习】(MySQL库的操作和表的操作)
数据库·学习·mysql·ubuntu·bash·数据库架构·数据库系统
Lucis__2 小时前
MySQL进阶:吃透表的CURD操作&深入理解索引
数据库·mysql·索引
JaydenAI2 小时前
[MAF预定义的IChatClient中间件-01]LoggingChatClient——在LLM调用前后输出日志
ai·c#·agent·日志·agent管道·chatclient中间件
IronMurphy13 小时前
MySQL拷打第二讲
数据库·mysql
nnsix15 小时前
C# 字符串 根据换行符分割
开发语言·c#
裴东青15 小时前
ProxySQL实现MySQL主从集群的读写分离
数据库·mysql·adb
handler0115 小时前
【MySQL】教你库与表的增删查改操作(基础)
运维·数据库·笔记·sql·mysql·数据·分析
吴可可12315 小时前
C# Exception命名空间冲突解决方案
c#