Update ClickHouse Demo

This commit is contained in:
sunkaixuan 2022-08-13 18:56:48 +08:00
parent 6e4fd3459a
commit f60a6780b6
5 changed files with 153 additions and 121 deletions

View File

@ -16,7 +16,7 @@ namespace OrmTest
/// Account have permission to create database /// Account have permission to create database
/// 用有建库权限的数据库账号 /// 用有建库权限的数据库账号
/// </summary> /// </summary>
public static string ConnectionString = "Database=default;Username=default;Password=;Host=localhost;Port=8123;Compression=False;UseSession=False;Timeout=120"; public static string ConnectionString = "Database=default;Username=default;Password=;Host=localhost;Port=8123;Compression=False;UseSession=False;Timeout=120;allowMultiQueries=true";
/// <summary> /// <summary>
/// Account have permission to create database /// Account have permission to create database
/// 用有建库权限的数据库账号 /// 用有建库权限的数据库账号

View File

@ -107,13 +107,13 @@ namespace OrmTest
Console.WriteLine("#### Subquery Start ####"); Console.WriteLine("#### Subquery Start ####");
var db = GetInstance(); var db = GetInstance();
var list = db.Queryable<Order>().Take(10).Select(it => new //var list = db.Queryable<Order>().Take(10).Select(it => new
{ //{
customName=SqlFunc.Subqueryable<Custom>().Where("it.CustomId=id").Select(s=>s.Name), // customName=SqlFunc.Subqueryable<Custom>().Where("it.CustomId=Id").Select(s=>s.Name),
customName2 = SqlFunc.Subqueryable<Custom>().Where("it.CustomId = id").Where(s => true).Select(s => s.Name) // customName2 = SqlFunc.Subqueryable<Custom>().Where("it.CustomId = Id").Where(s => true).Select(s => s.Name)
}).ToList(); //}).ToList();
var list2 = db.Queryable<Order>().Where(it => SqlFunc.Subqueryable<OrderItem>().Where(i => i.OrderId == it.Id).Any()).ToList(); //var list2 = db.Queryable<Order>().Where(it => SqlFunc.Subqueryable<OrderItem>().Where(i => i.OrderId == it.Id).Any()).ToList();
Console.WriteLine("#### Subquery End ####"); Console.WriteLine("#### Subquery End ####");
} }
@ -166,10 +166,10 @@ namespace OrmTest
db.Insertable(new B() { Name = "B" }).ExecuteCommand(); db.Insertable(new B() { Name = "B" }).ExecuteCommand();
db.Insertable(new ABMapping() { AId = 1, BId = 1 }).ExecuteCommand(); db.Insertable(new ABMapping() { AId = 1, BId = 1 }).ExecuteCommand();
var list4 = db.Queryable<ABMapping>() //var list4 = db.Queryable<ABMapping>()
.Mapper(it => it.A, it => it.AId) // .Mapper(it => it.A, it => it.AId)
.Mapper(it => it.B, it => it.BId) // .Mapper(it => it.B, it => it.BId)
.Where(it=>it.A.Id==1).ToList(); // .Where(it=>it.A.Id==1).ToList();
//Manual mode //Manual mode
var result = db.Queryable<OrderInfo>().Take(10).Select<ViewOrder>().Mapper((itemModel, cache) => var result = db.Queryable<OrderInfo>().Take(10).Select<ViewOrder>().Mapper((itemModel, cache) =>
@ -190,9 +190,9 @@ namespace OrmTest
Console.WriteLine("#### No Entity Start ####"); Console.WriteLine("#### No Entity Start ####");
var db = GetInstance(); var db = GetInstance();
var list = db.Queryable<dynamic>().AS("order").Where("id=id", new { id = 1 }).ToList(); var list = db.Queryable<dynamic>().AS("Order").Where("Id=Id", new { id = 1 }).ToList();
var list2 = db.Queryable<dynamic>("o").AS("order").AddJoinInfo("OrderDetail", "i", "o.id=i.OrderId").Where("id=id", new { id = 1 }).Select("o.*").ToList(); var list2 = db.Queryable<dynamic>("o").AS("Order").AddJoinInfo("OrderDetail", "i", "o.Id=i.OrderId").Where("Id=Id", new { id = 1 }).Select("o.*").ToList();
Console.WriteLine("#### No Entity End ####"); Console.WriteLine("#### No Entity End ####");
} }
@ -251,9 +251,9 @@ namespace OrmTest
/*** By sql***/ /*** By sql***/
//id=@id //id=@id
var list4 = db.Queryable<Order>().Where("id=@id", new { id = 1 }).ToList(); var list4 = db.Queryable<Order>().Where("Id=@id", new { id = 1 }).ToList();
//id=@id or name like '%'+@name+'%' //id=@id or name like '%'+@name+'%'
var list5 = db.Queryable<Order>().Where("id=@id or name like @name ", new { id = 1, name = "%jack%" }).ToList(); var list5 = db.Queryable<Order>().Where("Id=@id or Name like @name ", new { id = 1, name = "%jack%" }).ToList();
@ -261,12 +261,12 @@ namespace OrmTest
//id=1 //id=1
var conModels = new List<IConditionalModel>(); var conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" , FieldValueConvertFunc=it=>Convert.ToInt32(it) });//id=1 conModels.Add(new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "1" , FieldValueConvertFunc=it=>Convert.ToInt32(it) });//id=1
var student = db.Queryable<Order>().Where(conModels).ToList(); var student = db.Queryable<Order>().Where(conModels).ToList();
//Complex use case //Complex use case
List<IConditionalModel> Order = new List<IConditionalModel>(); List<IConditionalModel> Order = new List<IConditionalModel>();
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });//id=1 conModels.Add(new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });//id=1
//conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });// id like '%1%' //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });// id like '%1%'
//conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.IsNullOrEmpty }); //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.IsNullOrEmpty });
//conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.In, FieldValue = "1,2,3" }); //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.In, FieldValue = "1,2,3" });
@ -279,8 +279,8 @@ namespace OrmTest
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()// (id=1 or id=2 and id=1) ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()// (id=1 or id=2 and id=1)
{ {
//new KeyValuePair<WhereType, ConditionalModel>( WhereType.And ,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }), //new KeyValuePair<WhereType, ConditionalModel>( WhereType.And ,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }),
new KeyValuePair<WhereType, ConditionalModel> (WhereType.Or,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" , FieldValueConvertFunc = it => Convert.ToInt32(it) }), new KeyValuePair<WhereType, ConditionalModel> (WhereType.Or,new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "2" , FieldValueConvertFunc = it => Convert.ToInt32(it) }),
new KeyValuePair<WhereType, ConditionalModel> ( WhereType.And,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" ,FieldValueConvertFunc = it => Convert.ToInt32(it)}) new KeyValuePair<WhereType, ConditionalModel> ( WhereType.And,new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "2" ,FieldValueConvertFunc = it => Convert.ToInt32(it)})
} }
}); });
var list6 = db.Queryable<Order>().Where(conModels).ToList(); var list6 = db.Queryable<Order>().Where(conModels).ToList();

View File

@ -72,14 +72,14 @@ namespace OrmTest
/*** 3.by Dictionary ***/ /*** 3.by Dictionary ***/
var dt = new Dictionary<string, object>(); var dt = new Dictionary<string, object>();
dt.Add("id", 1); dt.Add("Id", 1);
dt.Add("name", "abc"); dt.Add("Name", "abc");
dt.Add("createTime", DateTime.Now); dt.Add("CreateTime", DateTime.Now);
var dtList = new List<Dictionary<string, object>>(); var dtList = new List<Dictionary<string, object>>();
dtList.Add(dt); dtList.Add(dt);
var t66 = db.Updateable(dt).AS("order").WhereColumns("id").ExecuteCommand(); var t66 = db.Updateable(dt).AS("Order").WhereColumns("Id").ExecuteCommand();
var t666 = db.Updateable(dtList).AS("order").WhereColumns("id").ExecuteCommand(); var t666 = db.Updateable(dtList).AS("Order").WhereColumns("Id").ExecuteCommand();

View File

@ -6,6 +6,7 @@ using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -37,6 +38,49 @@ namespace SqlSugar.ClickHouse
base._DbConnection = value; base._DbConnection = value;
} }
} }
public string SplitCommandTag => UtilConstants.ReplaceCommaKey;
public override int ExecuteCommand(string sql, params SugarParameter[] parameters)
{
if (sql == null) throw new Exception("sql is null");
if (sql.IndexOf(this.SplitCommandTag)>0)
{
var sqlParts=Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
var result = 0;
foreach (var item in sqlParts)
{
if (item.TrimStart('\r').TrimStart('\n') != "")
{
result += base.ExecuteCommand(item, parameters);
}
}
return result;
}
else
{
return base.ExecuteCommand(sql, parameters);
}
}
public override async Task<int> ExecuteCommandAsync(string sql, params SugarParameter[] parameters)
{
if (sql == null) throw new Exception("sql is null");
if (sql.IndexOf(this.SplitCommandTag) > 0)
{
var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList();
var result = 0;
foreach (var item in sqlParts)
{
if (item.TrimStart('\r').TrimStart('\n') != "")
{
result +=await base.ExecuteCommandAsync(item, parameters);
}
}
return result;
}
else
{
return await base.ExecuteCommandAsync(sql, parameters);
}
}
public override void BeginTran() public override void BeginTran()
{ {
//No Support //No Support

View File

@ -92,107 +92,95 @@ namespace SqlSugar.ClickHouse
protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList) protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList)
{ {
Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List<T> need Primary key"); StringBuilder sb = new StringBuilder();
int pageSize = 200; int i = 0;
int pageIndex = 1; sb.AppendLine(string.Join(UtilConstants.ReplaceCommaKey, groupList.Select(t =>
int totalRecord = groupList.Count;
int pageCount = (totalRecord + pageSize - 1) / pageSize;
StringBuilder batchUpdateSql = new StringBuilder();
while (pageCount >= pageIndex)
{ {
StringBuilder updateTable = new StringBuilder(); var updateTable = string.Format("ALTER TABLE {0} UPDATE ", base.GetTableNameStringNoWith);
string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it => var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Select(m => GetOracleUpdateColums(i, m, false)).ToArray());
var pkList = t.Where(s => s.IsPrimarykey).ToList();
List<string> whereList = new List<string>();
foreach (var item in pkList)
{ {
if (SetValues.IsValuable()) var isFirst = pkList.First() == item;
{ var whereString = "";
var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); whereString += GetOracleUpdateColums(i, item, true);
if (setValue != null && setValue.Any()) whereList.Add(whereString);
{ }
return setValue.First().Value; i++;
} return string.Format("{0} {1} WHERE {2} ", updateTable, setValues, string.Join(" AND", whereList));
} }).ToArray()));
var result = string.Format("{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName)); return sb.ToString();
return result; }
})); private string GetOracleUpdateColums(int i, DbColumnInfo m, bool iswhere)
string tempColumnValue = string.Join(",", groupList.First().Select(it => {
{ return string.Format("\"{0}\"={1}", m.DbColumnName, FormatValue(i, m.DbColumnName, m.Value, iswhere));
if (SetValues.IsValuable()) }
{ public object FormatValue(int i, string name, object value, bool iswhere)
var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); {
if (setValue != null && setValue.Any()) if (value == null)
{ {
return setValue.First().Value; return "NULL";
} }
} else
var result = Builder.GetTranslationColumnName(it.DbColumnName); {
return result; var type = UtilMethods.GetUnderType(value.GetType());
})); if (type == UtilConstants.DateType && iswhere == false)
batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString); {
int i = 0; var date = value.ObjToDate();
var tableColumnList = this.Context.DbMaintenance.GetColumnInfosByTableName(GetTableNameStringNoWith); if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
{
foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList()) date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
{ }
var isFirst = i == 0; if (this.Context.CurrentConnectionConfig?.MoreSettings?.DisableMillisecond == true)
if (!isFirst) {
{ return "'" + date.ToString("yyyy-MM-dd HH:mm:ss") + "'";
updateTable.Append(SqlTemplateBatchUnion); }
} else
updateTable.Append("\r\n (" + string.Join(",", columns.Select(it => {
{ return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
var columnInfo = tableColumnList.FirstOrDefault(x => x.DbColumnName.Equals(it.DbColumnName, StringComparison.OrdinalIgnoreCase)); }
var dbType = columnInfo?.DataType; }
if (dbType == null) { else if (type == UtilConstants.DateType && iswhere)
var typeName = it.PropertyType.Name.ToLower(); {
if (typeName == "int32") var parameterName = this.Builder.SqlParameterKeyWord + name + i;
typeName = "int"; this.Parameters.Add(new SugarParameter(parameterName, value));
if (typeName == "int64") return parameterName;
typeName = "long"; }
if (typeName == "int16") else if (type.IsEnum())
typeName = "short"; {
if (typeName == "boolean") if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true)
typeName = "bool"; {
return value.ToSqlValue();
var isAnyType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).Any(); }
if (isAnyType) else
{ {
dbType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).FirstOrDefault().Key; return Convert.ToInt64(value);
} }
else { }
dbType = "varchar"; else if (type == UtilConstants.ByteArrayType)
} {
} var parameterName = this.Builder.SqlParameterKeyWord + name + i;
return string.Format("CAST({0} AS {1})", FormatValue(it.Value,it.DbColumnName,i,it), dbType); this.Parameters.Add(new SugarParameter(parameterName, value));
return parameterName;
})) + ")"); }
++i; else if (value is int || value is long || value is short || value is short || value is byte)
{
return value;
}
else if (value is bool)
{
return value.ObjToString().ToLower();
}
else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
{
return "'" + value.ToString().ToSqlFilter() + "'";
}
else
{
return "'" + value.ToString() + "'";
} }
pageIndex++;
updateTable.Append("\r\n");
string whereString = null;
if (this.WhereValues.HasValue())
{
foreach (var item in WhereValues)
{
var isFirst = whereString == null;
whereString += (isFirst ? null : " AND ");
whereString += item;
}
}
else if (PrimaryKeys.HasValue())
{
foreach (var item in PrimaryKeys)
{
var isFirst = whereString == null;
whereString += (isFirst ? null : " AND ");
whereString += string.Format("{0}.{1}=T.{1}", GetTableNameStringNoWith, Builder.GetTranslationColumnName(item));
}
}
var format = string.Format(SqlTemplateJoin, updateTable, whereString, tempColumnValue);
batchUpdateSql.Replace("${0}", format);
batchUpdateSql.Append(";");
} }
return batchUpdateSql.ToString();
} }
} }
} }