From 46202a02985c9fbf4807e8058a028ba2e3e574a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Thu, 7 Mar 2024 20:01:09 +0800 Subject: [PATCH] =?UTF-8?q?[improv]=20=E4=BC=98=E5=8C=96MySql=E6=AD=A3?= =?UTF-8?q?=E5=90=91=E5=B7=A5=E7=A8=8B=EF=BC=8C=E4=B8=80=E6=AC=A1=E6=80=A7?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=89=80=E6=9C=89=E8=A1=A8=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E5=8A=A0=E5=BF=AB=E5=90=AF=E5=8A=A8=E9=80=9F?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XCode/DataAccessLayer/Database/MySql.cs | 158 +++++++++++++----- XUnitTest.XCode/DataAccessLayer/MySqlTests.cs | 23 ++- 2 files changed, 136 insertions(+), 45 deletions(-) diff --git a/XCode/DataAccessLayer/Database/MySql.cs b/XCode/DataAccessLayer/Database/MySql.cs index 5d941e257..339be37c4 100755 --- a/XCode/DataAccessLayer/Database/MySql.cs +++ b/XCode/DataAccessLayer/Database/MySql.cs @@ -132,7 +132,7 @@ public override String FormatValue(IDataColumn field, Object? value) return base.FormatValue(field, value); } - private static readonly Char[] _likeKeys = new[] { '\\', '\'', '\"', '%', '_' }; + private static readonly Char[] _likeKeys = ['\\', '\'', '\"', '%', '_']; /// 格式化模糊搜索的字符串。处理转义字符 /// 字段 @@ -402,7 +402,15 @@ protected override List OnGetTables(String[]? names) var dt = ss.Query(sql, null); if (dt.Rows == null || dt.Rows.Count == 0) return list; - var hs = new HashSet(names ?? new String[0], StringComparer.OrdinalIgnoreCase); + sql = $"select * from information_schema.columns where table_schema='{db}'"; + if (names != null && names.Length > 0) sql += " and table_name in ('" + names.Join("','") + "')"; + var columns = ss.Query(sql, null); + + sql = $"select * from information_schema.STATISTICS where table_schema='{db}'"; + if (names != null && names.Length > 0) sql += " and table_name in ('" + names.Join("','") + "')"; + var indexes = ss.Query(sql, null); + + var hs = new HashSet(names ?? [], StringComparer.OrdinalIgnoreCase); // 所有表 foreach (var dr in dt) @@ -416,65 +424,127 @@ protected override List OnGetTables(String[]? names) table.DbType = Database.Type; #region 字段 - - sql = $"SHOW FULL COLUMNS FROM `{db}`.`{name}`"; - var dcs = ss.Query(sql, null); - foreach (var dc in dcs) + if (columns.Rows != null && columns.Rows.Count > 0) { - var field = table.CreateColumn(); + foreach (var dc in columns) + { + if (dc["TABLE_NAME"] + "" != table.TableName) continue; - field.ColumnName = dc["Field"] + ""; - field.RawType = dc["Type"] + ""; - field.Description = dc["Comment"] + ""; + var field = table.CreateColumn(); - if (dc["Extra"] + "" == "auto_increment") field.Identity = true; - if (dc["Key"] + "" == "PRI") field.PrimaryKey = true; - if (dc["Null"] + "" == "YES") field.Nullable = true; + field.ColumnName = dc["COLUMN_NAME"] + ""; + field.RawType = dc["COLUMN_TYPE"] + ""; + field.Description = dc["COLUMN_COMMENT"] + ""; - field.Length = field.RawType.Substring("(", ")").ToInt(); - field.DataType = GetDataType(field); + if (dc["Extra"] + "" == "auto_increment") field.Identity = true; + if (dc["COLUMN_KEY"] + "" == "PRI") field.PrimaryKey = true; + if (dc["IS_NULLABLE"] + "" == "YES") field.Nullable = true; - if (field.DataType == null) - { - if (field.RawType.StartsWithIgnoreCase("varchar", "nvarchar")) field.DataType = typeof(String); - } + field.Length = field.RawType.Substring("(", ")").ToInt(); + + var type = GetDataType(field); + if (type == null) + { + if (field.RawType.StartsWithIgnoreCase("varchar", "nvarchar")) field.DataType = typeof(String); + } + else + field.DataType = type; - // MySql中没有布尔型,这里处理YN枚举作为布尔型 - if (field.RawType is "enum('N','Y')" or "enum('Y','N')") field.DataType = typeof(Boolean); + // MySql中没有布尔型,这里处理YN枚举作为布尔型 + if (field.RawType is "enum('N','Y')" or "enum('Y','N')") field.DataType = typeof(Boolean); - field.Fix(); + field.Fix(); - table.Columns.Add(field); + table.Columns.Add(field); + } } + else + { + sql = $"SHOW FULL COLUMNS FROM `{db}`.`{name}`"; + var dcs = ss.Query(sql, null); + foreach (var dc in dcs) + { + var field = table.CreateColumn(); - #endregion 字段 + field.ColumnName = dc["Field"] + ""; + field.RawType = dc["Type"] + ""; + field.Description = dc["Comment"] + ""; - #region 索引 + if (dc["Extra"] + "" == "auto_increment") field.Identity = true; + if (dc["Key"] + "" == "PRI") field.PrimaryKey = true; + if (dc["Null"] + "" == "YES") field.Nullable = true; - sql = $"SHOW INDEX FROM `{db}`.`{name}`"; - var dis = ss.Query(sql, null); - foreach (var dr2 in dis) - { - var dname = dr2["Key_name"] + ""; - var di = table.Indexes.FirstOrDefault(e => e.Name == dname) ?? table.CreateIndex(); - //di.Name = dname; - di.Unique = dr2.Get("Non_unique") == 0; + field.Length = field.RawType.Substring("(", ")").ToInt(); + field.DataType = GetDataType(field); - var cname = dr2.Get("Column_name"); - if (cname.IsNullOrEmpty()) continue; + if (field.DataType == null) + { + if (field.RawType.StartsWithIgnoreCase("varchar", "nvarchar")) field.DataType = typeof(String); + } - var cs = new List(); - if (di.Columns != null && di.Columns.Length > 0) cs.AddRange(di.Columns); - cs.Add(cname); - di.Columns = cs.ToArray(); + // MySql中没有布尔型,这里处理YN枚举作为布尔型 + if (field.RawType is "enum('N','Y')" or "enum('Y','N')") field.DataType = typeof(Boolean); - if (di.Name == null) - { - di.Name = dname; - table.Indexes.Add(di); + field.Fix(); + + table.Columns.Add(field); } } + #endregion 字段 + #region 索引 + if (indexes.Rows != null && indexes.Rows.Count > 0) + { + foreach (var dr2 in indexes) + { + if (dr2["TABLE_NAME"] + "" != table.TableName) continue; + + var dname = dr2["INDEX_NAME"] + ""; + var di = table.Indexes.FirstOrDefault(e => e.Name == dname) ?? table.CreateIndex(); + //di.Name = dname; + di.Unique = dr2.Get("Non_unique") == 0; + + var cname = dr2.Get("Column_name"); + if (cname.IsNullOrEmpty()) continue; + + var cs = new List(); + if (di.Columns != null && di.Columns.Length > 0) cs.AddRange(di.Columns); + cs.Add(cname); + di.Columns = cs.ToArray(); + + if (di.Name == null) + { + di.Name = dname; + table.Indexes.Add(di); + } + } + } + else + { + sql = $"SHOW INDEX FROM `{db}`.`{name}`"; + var dis = ss.Query(sql, null); + foreach (var dr2 in dis) + { + var dname = dr2["Key_name"] + ""; + var di = table.Indexes.FirstOrDefault(e => e.Name == dname) ?? table.CreateIndex(); + //di.Name = dname; + di.Unique = dr2.Get("Non_unique") == 0; + + var cname = dr2.Get("Column_name"); + if (cname.IsNullOrEmpty()) continue; + + var cs = new List(); + if (di.Columns != null && di.Columns.Length > 0) cs.AddRange(di.Columns); + cs.Add(cname); + di.Columns = cs.ToArray(); + + if (di.Name == null) + { + di.Name = dname; + table.Indexes.Add(di); + } + } + } #endregion 索引 // 修正关系数据 @@ -595,7 +665,7 @@ public override String FieldClause(IDataColumn field, Boolean onlyDefine) protected override Boolean DatabaseExist(String databaseName) { - var dt = GetSchema(_.Databases, new String[] { databaseName }); + var dt = GetSchema(_.Databases, [databaseName]); return dt != null && dt.Rows != null && dt.Rows.Count > 0; } diff --git a/XUnitTest.XCode/DataAccessLayer/MySqlTests.cs b/XUnitTest.XCode/DataAccessLayer/MySqlTests.cs index fa407979c..718523b07 100644 --- a/XUnitTest.XCode/DataAccessLayer/MySqlTests.cs +++ b/XUnitTest.XCode/DataAccessLayer/MySqlTests.cs @@ -309,7 +309,28 @@ public void GetTables() var dal = DAL.Create("member_mysql"); var tables = dal.Tables; - Assert.True(tables.Count > 0); + Assert.NotEmpty(tables); + + foreach (var table in tables) + { + Assert.NotEmpty(table.Columns); + foreach (var dc in table.Columns) + { + Assert.NotEmpty(dc.Name); + Assert.NotEmpty(dc.ColumnName); + Assert.NotEmpty(dc.RawType); + Assert.NotNull(dc.DataType); + Assert.NotEmpty(dc.DisplayName); + Assert.NotEmpty(dc.Description); + } + + //Assert.NotEmpty(table.Indexes); + foreach (var di in table.Indexes) + { + Assert.NotEmpty(di.Name); + Assert.NotEmpty(di.Columns); + } + } dal.SetTables(User.Meta.Table.DataTable); }