- 增加 IDbFirst.GetTableByName 方法获取单表信息,包括列详情、主键、唯一键、索引、备注;

This commit is contained in:
28810
2020-08-11 23:23:54 +08:00
parent da6effcf52
commit 0d832a5a23
33 changed files with 994 additions and 601 deletions

View File

@ -155,18 +155,28 @@ namespace FreeSql.Sqlite
var tbname = _commonUtils.SplitTableName(name);
if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type = 'table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")} = {_commonUtils.FormatSql("{0}", tbname[1])}";
var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type='table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}";
return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
}
public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
{
var loc1 = new List<DbTableInfo>();
var loc2 = new Dictionary<string, DbTableInfo>();
var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
var database = database2?.ToArray();
if (database == null || database.Any() == false) database = GetDatabases().ToArray();
string[] tbname = null;
if (string.IsNullOrEmpty(tablename) == false)
{
tbname = _commonUtils.SplitTableName(tablename);
if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
database = new[] { tbname[0] };
}
else if (database == null || database.Any() == false)
database = GetDatabases().ToArray();
if (database.Any() == false) return loc1;
Action<object[], int> addColumn = (row, position) =>
@ -212,7 +222,7 @@ tbl_name,
'' Comment,
'TABLE',
sql
from {db}.sqlite_master where type = 'table'";
from {db}.sqlite_master where type='table'{(tbname == null ? "" : $" and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
if (ds == null) continue;
@ -284,34 +294,37 @@ from {db}.sqlite_master where type = 'table'";
addColumn(ds2item, ++position);
}
var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
if (fks != null && fks.Length > 0)
if (tbname == null)
{
var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
foreach (var fk in fks)
var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
if (fks != null && fks.Length > 0)
{
string column = string.Concat(fk[3]);
string fk_id = $"{db}.{table}.{fk[0]}";
string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}";
string referenced_column = string.Concat(fk[4]);
if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
var loc9 = loc3[table_id][column];
if (loc2.ContainsKey(ref_table_id) == false) continue;
var loc10 = loc2[ref_table_id];
var loc11 = loc3[ref_table_id][referenced_column];
var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
foreach (var fk in fks)
{
string column = string.Concat(fk[3]);
string fk_id = $"{db}.{table}.{fk[0]}";
string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}";
string referenced_column = string.Concat(fk[4]);
if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
var loc9 = loc3[table_id][column];
if (loc2.ContainsKey(ref_table_id) == false) continue;
var loc10 = loc2[ref_table_id];
var loc11 = loc3[ref_table_id][referenced_column];
Dictionary<string, DbForeignInfo> loc12 = null;
DbForeignInfo loc13 = null;
if (!fkColumns.TryGetValue(table_id, out loc12))
fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
if (!loc12.TryGetValue(fk_id, out loc13))
loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
loc13.Columns.Add(loc9);
loc13.ReferencedColumns.Add(loc11);
Dictionary<string, DbForeignInfo> loc12 = null;
DbForeignInfo loc13 = null;
if (!fkColumns.TryGetValue(table_id, out loc12))
fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
if (!loc12.TryGetValue(fk_id, out loc13))
loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
loc13.Columns.Add(loc9);
loc13.ReferencedColumns.Add(loc11);
}
foreach (var table_id2 in fkColumns.Keys)
foreach (var fk in fkColumns[table_id2])
loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value);
}
foreach (var table_id2 in fkColumns.Keys)
foreach (var fk in fkColumns[table_id2])
loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value);
}
}
}