From 63612d20fdbcc9bef02c5b55a526eb8ade4ed925 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 31 Dec 2019 22:49:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=8C=E5=96=84=20PgSql=20OnConflictDoUp?= =?UTF-8?q?date=20=E5=8A=9F=E8=83=BD=E5=A2=9E=E5=8A=A0=20DO=20NOTHING=20?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=EF=BC=9B#174?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.xml | 131 ++++++++++++++++++ .../Curd/OnConflictDoUpdate.cs | 68 +++++---- 2 files changed, 172 insertions(+), 27 deletions(-) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 947162a6..59e0a2ec 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2255,6 +2255,137 @@ + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + + + + + + + 查询 + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) + + + + + + 可自定义解析表达式 diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs index 2e1dd474..bedded9d 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs @@ -21,6 +21,7 @@ namespace FreeSql.PostgreSQL.Curd (_pgsqlUpdatePriv = new PostgreSQLUpdate(_pgsqlInsert.InternalOrm, _pgsqlInsert.InternalCommonUtils, _pgsqlInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" } .NoneParameter().SetSource(_pgsqlInsert.InternalSource) as PostgreSQLUpdate); ColumnInfo[] _columns; + bool _doNothing; public OnConflictDoUpdate(IInsert insert, Expression> columns = null) { @@ -86,6 +87,12 @@ namespace FreeSql.PostgreSQL.Curd return this; } + public OnConflictDoUpdate DoNothing() + { + _doNothing = true; + return this; + } + public string ToSql() { var sb = new StringBuilder(); @@ -95,41 +102,48 @@ namespace FreeSql.PostgreSQL.Curd if (a > 0) sb.Append(", "); sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name)); } - sb.Append(") DO UPDATE SET\r\n"); - - var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; - var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; - if (sbSetEmpty == false || sbSetIncrEmpty == false) + if (_doNothing) { - if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2)); - if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString()); + sb.Append(") DO NOTHING"); } else { - var colidx = 0; - foreach (var col in _pgsqlInsert.InternalTable.Columns.Values) + sb.Append(") DO UPDATE SET\r\n"); + + var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; + var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; + if (sbSetEmpty == false || sbSetIncrEmpty == false) { - if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue; + if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2)); + if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString()); + } + else + { + var colidx = 0; + foreach (var col in _pgsqlInsert.InternalTable.Columns.Values) + { + if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue; - if (colidx > 0) sb.Append(", \r\n"); + if (colidx > 0) sb.Append(", \r\n"); - if (col.Attribute.IsVersion == true) - { - var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); - sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1"); + if (col.Attribute.IsVersion == true) + { + var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); + sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1"); + } + else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name)) + { + var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim(); + sb.Append(caseWhen); + if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col); + } + else + { + var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); + sb.Append(field).Append(" = EXCLUDED.").Append(field); + } + ++colidx; } - else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name)) - { - var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim(); - sb.Append(caseWhen); - if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col); - } - else - { - var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); - sb.Append(field).Append(" = EXCLUDED.").Append(field); - } - ++colidx; } }