技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
sqlsugar【数据与研究】Use when doing multi-database ORM operations in .NET — SQL Server, MySQL, PostgreSQL, SQLite, Oracle with fluent API, code-first, and LINQ. SqlSugar: high-performance .NET ORM supporting 10+ databases.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: sqlsugar description: "Use when doing multi-database ORM operations in .NET — SQL Server, MySQL, PostgreSQL, SQLite, Oracle with fluent API, code-first, and LINQ. SqlSugar: high-performance .NET ORM supporting 10+ databases." tags:
项目地址: https://github.com/DotNetNext/SqlSugar
官方文档: https://www.donet5.com/Home/Doc
NuGet:
SqlSugar/SqlSugarCore最新版本: SqlSugarCore 5.1.4.221(.NET)/ SqlSugar 5.1.4.207(.NET Framework)(截至2026-09,NuGet)
许可证: MIT
SqlSugar 主要特性:
Queryable<T>().Where(...).Select(...).ToList()Insertable / Updateable / Deleteable.ExecuteCommand()UseTran 自动管理dotnet add package SqlSugarCore # .NET 6+
# 或
dotnet add package SqlSugar # .NET Framework
using SqlSugar;
var db = new SqlSugarClient(new ConnectionConfig {
DbType = DbType.MySql,
ConnectionString = "server=127.0.0.1;uid=root;pwd=...;database=demo",
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute // 通过特性识别主键
});
db.Aop.OnLogExecuting = (sql, p) => Console.WriteLine(sql);
多数据库:使用
SqlSugarClient(List<ConnectionConfig>)或SqlSugarScope(推荐 DI 注入)。
builder.Services.AddSingleton<ISqlSugarClient>(sp =>
new SqlSugarScope(new ConnectionConfig {
DbType = DbType.SqlServer,
ConnectionString = builder.Configuration.GetConnectionString("Default"),
IsAutoCloseConnection = true
}));
[SugarTable("users")]
public class User
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(Length = 50, IsNullable = false)]
public string Name { get; set; } = "";
public int Age { get; set; }
[SugarColumn(IsNullable = true, ColumnDataType = "datetime")]
public DateTime? CreateTime { get; set; }
[SugarColumn(IsIgnore = true)]
public string Computed { get; set; } = "";
}
// 插入(自增主键回填)
int id = db.Insertable(new User { Name = "Tom", Age = 18 })
.ExecuteReturnIdentity();
// 批量
db.Insertable(list).ExecuteCommand();
// 更新
db.Updateable(new User { Id = 1, Name = "Tom2" }).ExecuteCommand();
db.Updateable<User>().SetColumns(u => new User { Age = u.Age + 1 })
.Where(u => u.Id == 1).ExecuteCommand();
// 删除
db.Deleteable<User>().Where(u => u.Id == 1).ExecuteCommand();
db.Deleteable<User>(new[] { 1, 2, 3 }).ExecuteCommand();
var u = db.Queryable<User>().First(u => u.Id == 1);
var ls = db.Queryable<User>()
.Where(u => u.Age > 18 && u.Name.Contains("T"))
.OrderBy(u => u.Id, OrderByType.Desc)
.Select(u => new { u.Id, u.Name })
.ToList();
// 分页(签名:ToPageList(pageIndex, pageSize, ref totalNumber))
int total = 0;
var page = db.Queryable<User>()
.Where(u => u.Age > 18)
.ToPageList(1, 20, ref total);
// JOIN
var join = db.Queryable<User, Order>((u, o) => new JoinQueryInfos(
JoinType.Left, u.Id == o.UserId))
.Where((u, o) => u.Age > 18)
.Select((u, o) => new { u.Name, o.Amount })
.ToList();
var ls = await db.Queryable<User>().ToListAsync();
await db.Insertable(u).ExecuteCommandAsync();
var result = await db.Ado.UseTranAsync(async () => {
await db.Insertable(a).ExecuteCommandAsync();
await db.Updateable(b).ExecuteCommandAsync();
});
if (!result.IsSuccess) Console.WriteLine(result.ErrorMessage);
db.DbMaintenance.CreateDatabase(); // 创建库
db.CodeFirst.InitTables(typeof(User), typeof(Order)); // 创建/更新表
db.CodeFirst.InitTables<User>();
public class Order {
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; } // 不要 IsIdentity
}
SnowFlakeSingle.WorkId = 1; // 设置工作机器号
var o = new Order { Id = SnowFlakeSingle.Instance.NextId() };
new ConnectionConfig {
ConnectionString = "主库",
SlaveConnectionConfigs = new() {
new SlaveConnectionConfig { HitRate = 10, ConnectionString = "从库1" },
new SlaveConnectionConfig { HitRate = 10, ConnectionString = "从库2" }
}
};
写走主库,读自动负载到从库。
[SplitTable(SplitType.Month)] // 月分表
[SugarTable("Logs_{year}{month}")]
public class Log { ... }
db.Insertable(log).SplitTable().ExecuteCommand();
db.Queryable<Log>().SplitTable(new DateTime(2024, 1, 1), new DateTime(2024, 12, 31)).ToList();
db.Aop.OnLogExecuting = (sql, p) => log.Info(sql);
db.Aop.OnError = ex => log.Error(ex);
db.Aop.OnLogExecuted = (sql,p) => /* 监控 */;
db.Aop.DataExecuting = (val, e) => /* 自动填充 CreateTime */;
Insertable(list).UseSqlBulkCopy() 或 PageSizeToPageList,不要 ToList 全量SqlSugarClientSqlSugarScope(线程安全),单次使用用 SqlSugarClient(记得 IsAutoCloseConnection = true)[SugarTable("表名")] + [SugarColumn(IsPrimaryKey = true)] 标注特性db.CodeFirst.InitTables<T>() 自动创建/更新表结构Insertable/Updateable/Deleteable/Queryable 链式 APISlaveConnectionConfigs)、分表([SplitTable])、AOP 日志(db.Aop.OnLogExecuting)SqlSugarScope(内部连接池),SqlSugarClient 非线程安全[SugarColumn(IsPrimaryKey = true)],自增用 IsIdentity = true,雪花 ID 不要设 IsIdentityInsertable(list).UseSqlBulkCopy() 比逐条快 10-100 倍ToPageList(pageIndex, pageSize, ref total) 而不是 ToList() 后手动分页Charset=utf8mb4,列类型用 utf8mb4OnLogExecuting 异步写日志,避免阻塞主查询流程| 场景 | 推荐方案 |
|---|---|
| 新项目快速开发 | SqlSugar(Code First + 链式查询) |
| 政企项目(达梦/金仓) | SqlSugar 或 SOD(两者都支持国产库) |
| 已有数据库(DB First) | SqlSugar(自动生成实体) |
| 高性能批量处理 | SqlSugar + SqlBulkCopy |
| MyBatis 风格 XML | SOD SQL-MAP |
| 问题 | 解决 |
|---|---|
| 表名映射不对 | [SugarTable("name")] 或全局 EntityService |
| 外键关联未带条件 | Mapper 配合 Includes 显式指定 |
| 多线程异常 | 使用 SqlSugarScope(线程安全) |
| 中文乱码 | MySQL 用 utf8mb4,连接字符串加 Charset=utf8mb4 |
| 时间精度丢失 | 列改 datetime(3) 或 datetime2 |