Sqlx 0.3.0
See the version list below for details.
dotnet add package Sqlx --version 0.3.0
NuGet\Install-Package Sqlx -Version 0.3.0
<PackageReference Include="Sqlx" Version="0.3.0" />
<PackageVersion Include="Sqlx" Version="0.3.0" />
<PackageReference Include="Sqlx" />
paket add Sqlx --version 0.3.0
#r "nuget: Sqlx, 0.3.0"
#:package Sqlx@0.3.0
#addin nuget:?package=Sqlx&version=0.3.0
#tool nuget:?package=Sqlx&version=0.3.0
Sqlx - 让数据库操作变简单
<div align="center">
🎯 5分钟上手 · 📝 不用写SQL列名 · ⚡ 性能极致 · 🌐 支持6种数据库
</div>
🤔 这是什么?
Sqlx 是一个让你不用手写 SQL 列名的数据库工具。你只需要定义好你的数据类型,Sqlx 会自动帮你生成所有的数据库操作代码。
简单来说:
- ❌ 不用写
INSERT INTO users (id, name, email, age) VALUES ... - ✅ Sqlx 方式:
{{insert into}} ({{columns --exclude Id}}) VALUES ({{values}}) - 🎉 添加/删除字段时,代码自动更新,不用改 SQL!
⚡ 一分钟速查
| 你想做什么 | Sqlx 写法 | 生成的 SQL |
|---|---|---|
| 查所有 | SELECT {{columns}} FROM {{table}} |
SELECT id, name, email FROM users |
| 按ID查 | WHERE id = @id |
WHERE id = @id |
| 条件查 | WHERE is_active = @active |
WHERE is_active = @active |
| 比较查 | WHERE age >= @min |
WHERE age >= @min |
| 插入 | INSERT INTO {{table}} ({{columns --exclude Id}}) |
INSERT INTO users (name, email) |
| 更新 | UPDATE {{table}} SET {{set --exclude Id}} |
UPDATE users SET name=@Name, email=@Email |
| 删除 | DELETE FROM {{table}} WHERE id = @id |
DELETE FROM users WHERE id = @id |
| 计数 | SELECT COUNT(*) |
SELECT COUNT(*) |
| 排序 | {{orderby name --desc}} |
ORDER BY name DESC |
🚀 快速体验
第一步:安装
dotnet add package Sqlx
dotnet add package Sqlx.Generator
第二步:定义你的数据
// 就像平时定义 C# 类一样
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
第三步:定义你要做什么操作
public interface IUserService
{
// 查询所有用户 - 自动生成列名
[Sqlx("SELECT {{columns}} FROM {{table}}")]
Task<List<User>> GetAllAsync();
// 查询单个用户 - 直接写 SQL
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE id = @id")]
Task<User?> GetByIdAsync(int id);
// 条件查询 - 直接写 SQL
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE is_active = @isActive")]
Task<List<User>> GetActiveUsersAsync(bool isActive);
// 创建用户 - 自动排除 Id 字段
[Sqlx("INSERT INTO {{table}} ({{columns --exclude Id}}) VALUES ({{values}})")]
Task<int> CreateAsync(User user);
// 更新用户 - 自动生成 SET 语句
[Sqlx("UPDATE {{table}} SET {{set --exclude Id}} WHERE id = @id")]
Task<int> UpdateAsync(User user);
// 删除用户
[Sqlx("DELETE FROM {{table}} WHERE id = @id")]
Task<int> DeleteAsync(int id);
}
语法说明:
{{table}}- 自动从 TableName 特性获取表名{{columns}}- 自动从实体类生成列名列表{{values}}- 自动生成参数占位符(@Param1, @Param2...){{set}}- 自动生成 SET 子句(col1=@val1, col2=@val2...)WHERE id = @id- 直接写 SQL,简单清晰--exclude Id- 排除字段(像命令行参数)COUNT(*)- 直接写,比{{count}}更清晰
第四步:就这么简单!
// Sqlx 自动生成实现代码,你只需要这一行
[RepositoryFor(typeof(IUserService))]
public partial class UserService(IDbConnection connection) : IUserService;
第五步:开始使用
var service = new UserService(connection);
// 查询
var users = await service.GetAllAsync();
var user = await service.GetByIdAsync(1);
// 创建
await service.CreateAsync(new User { Name = "张三", Email = "zhangsan@example.com", Age = 25 });
// 更新
user.Name = "李四";
await service.UpdateAsync(user);
// 删除
await service.DeleteAsync(1);
就这么简单! 不用写任何 SQL 列名,不用写任何实现代码!
💡 核心功能一览
1️⃣ 自动生成列名 - 永远不用手写!
❌ 传统方式:每次都要手写所有列名
插入数据:
var sql = "INSERT INTO users (name, email, age, phone, address) VALUES (@Name, @Email, @Age, @Phone, @Address)";
// 😱 10个字段就要写20次列名!
更新数据:
var sql = "UPDATE users SET name = @Name, email = @Email, age = @Age, phone = @Phone, address = @Address WHERE id = @Id";
// 😱 更新5个字段要写5遍 "字段 = @参数"!
问题: 添加一个新字段 city?需要改 10+ 个地方的 SQL!
✅ Sqlx 方式:占位符自动搞定
插入数据:
// 占位符写法(一目了然)
[Sqlx("{{insert}} ({{columns:auto|exclude=Id}}) VALUES ({{values:auto}})")]
Task<int> CreateAsync(User user);
// 自动生成的 SQL:
// INSERT INTO users (name, email, age, phone, address) VALUES (@Name, @Email, @Age, @Phone, @Address)
更新数据:
// 占位符写法(一目了然)
[Sqlx("{{update}} SET {{set:auto|exclude=Id}} WHERE {{where:id}}")]
Task<int> UpdateAsync(User user);
// 自动生成的 SQL:
// UPDATE users SET name = @Name, email = @Email, age = @Age, phone = @Phone, address = @Address WHERE id = @Id
占位符解释:
{{update}}→UPDATE users(自动表名){{set:auto|exclude=Id}}→name = @Name, email = @Email, ...(自动 SET 语句,排除 Id){{where:id}}→WHERE id = @Id(自动 WHERE 条件)
好处:
- 🎉 添加新字段
city?不用改任何 SQL,自动包含! - 🚀 减少 90% 的重复代码
- 🛡️ 编译时检查,零拼写错误
2️⃣ 支持 6 种数据库 - 一份代码到处用
问题:不同数据库语法不一样
// ❌ MySQL 用反引号
"SELECT `name`, `email` FROM `users` WHERE `id` = @id"
// ❌ SQL Server 用方括号
"SELECT [name], [email] FROM [users] WHERE [id] = @id"
// ❌ PostgreSQL 用双引号和 $1
"SELECT \"name\", \"email\" FROM \"users\" WHERE \"id\" = $1"
// 😱 换个数据库要改所有 SQL!
解决:Sqlx 自动适配
// ✅ 一份代码,自动适配所有数据库
[Sqlx("SELECT {{columns:auto}} FROM {{table}} WHERE {{where:id}}")]
Task<User?> GetByIdAsync(int id);
// 🎉 支持:SQL Server、MySQL、PostgreSQL、SQLite、Oracle、DB2
3️⃣ 智能占位符 - 友好直观的统一语法
Sqlx 提供了 40+ 个智能占位符,设计原则:
设计原则:
- ✅ 清晰命名:用完整单词,一看就懂
- ✅ 默认简化:常用参数作为默认值
- ✅ 空格分隔:
{{where id}}比{{where:id}}更自然 - ✅ 命令行选项:
--exclude--only像 Linux 命令 - ✅ 灵活混用:占位符与 SQL 可以混合使用
核心占位符速查
| 你想做什么 | Sqlx 写法 | 生成的 SQL |
|---|---|---|
| 📝 插入数据 | INSERT INTO {{table}} ({{columns --exclude Id}}) VALUES ({{values}}) |
INSERT INTO users (name, email) VALUES (@Name, @Email) |
| 🔄 更新数据 | UPDATE {{table}} SET {{set --exclude Id}} WHERE id = @id |
UPDATE users SET name=@Name WHERE id=@id |
| 🗑️ 删除数据 | DELETE FROM {{table}} WHERE id = @id |
DELETE FROM users WHERE id = @id |
| 🔍 查询数据 | SELECT {{columns}} FROM {{table}} |
SELECT id, name, email FROM users |
| 🎯 条件查询 | WHERE is_active = @active |
WHERE is_active = @active |
| 🔢 比较查询 | WHERE age >= @min |
WHERE age >= @min |
| 📊 排序 | {{orderby name --desc}} |
ORDER BY name DESC |
| 🔢 计数 | SELECT COUNT(*) FROM {{table}} |
SELECT COUNT(*) FROM users |
| 🔎 LIKE查询 | WHERE name LIKE @pattern |
WHERE name LIKE @pattern |
| ✔️ NULL检查 | WHERE email IS NOT NULL |
WHERE email IS NOT NULL |
WHERE 条件(直接写 SQL)
简单、清晰、直接:
// === 基本条件 ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE is_active = @active")]
Task<List<User>> GetActiveUsersAsync(bool active);
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE age >= @min")]
Task<List<User>> GetAdultsAsync(int min = 18);
// === 组合条件(AND / OR) ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE is_active = @active AND age >= @minAge")]
Task<List<User>> SearchAsync(bool active, int minAge);
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE name = @name OR email = @email")]
Task<User?> FindByNameOrEmailAsync(string name, string email);
// === 复杂组合 ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE (name = @name OR email = @email) AND is_active = true")]
Task<User?> FindActiveUserAsync(string name, string email);
// === NULL 检查 ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE email IS NOT NULL")]
Task<List<User>> GetUsersWithEmailAsync();
// === LIKE 查询 ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE name LIKE @pattern")]
Task<List<User>> SearchByNameAsync(string pattern);
// === IN 查询 ===
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE id IN (SELECT value FROM json_each(@idsJson))")]
Task<List<User>> GetByIdsAsync(string idsJson);
其他实用功能
// 部分字段查询
[Sqlx("SELECT {{columns --only name email}} FROM {{table}} WHERE age >= @minAge")]
Task<List<User>> GetNamesAsync(int minAge);
// 排序
[Sqlx("SELECT {{columns}} FROM {{table}} WHERE is_active = true {{orderby created_at --desc}}")]
Task<List<User>> GetRecentActiveAsync();
// 分页
[Sqlx("SELECT {{columns}} FROM {{table}} {{orderby id}} {{limit 10 --offset @skip}}")]
Task<List<User>> GetPagedAsync(int skip);
语法总结:
{{table}}{{columns}}{{values}}{{set}}- 智能占位符(自动生成)WHERE expr- 直接写 SQL,简单清晰INSERT INTOUPDATEDELETE FROM- 直接写,无需占位符COUNT(*)- 直接写,无需{{count}}--exclude Id- 排除字段(命令行风格)--only name email- 只包含指定字段{{orderby col --desc}}- 排序占位符(支持选项)
完整功能列表 → 40+占位符详解
4️⃣ 常见场景示例
场景1:更新数据的3种方式
方式1:更新所有字段(最常用)
// ✅ 自动更新所有字段,排除ID
[Sqlx("{{update}} SET {{set:auto|exclude=Id}} WHERE {{where:id}}")]
Task<int> UpdateAsync(User user);
// 生成SQL:UPDATE users SET name = @Name, email = @Email, age = @Age WHERE id = @Id
// 用法:await UpdateAsync(user);
方式2:只更新指定字段
// ✅ 只更新 name 和 email
[Sqlx("{{update}} SET {{set:name,email}} WHERE {{where:id}}")]
Task<int> UpdateNameEmailAsync(User user);
// 生成SQL:UPDATE users SET name = @Name, email = @Email WHERE id = @Id
// 用法:await UpdateNameEmailAsync(user);
方式3:批量更新
// ✅ 批量更新状态
[Sqlx("{{update}} SET {{set:is_active,updated_at}} WHERE {{where:id_in_json_array}}")]
Task<int> BatchUpdateStatusAsync(string idsJson, bool isActive, DateTime updatedAt);
// 生成SQL:UPDATE users SET is_active = @isActive, updated_at = @updatedAt WHERE id IN (...)
// 用法:await BatchUpdateStatusAsync(idsJson, true, DateTime.Now);
对比说明:
| 方式 | 占位符 | 何时使用 |
|------|--------|---------|
| {{set:auto}} | 所有字段(可排除) | 更新整个对象 |
| {{set:字段1,字段2}} | 指定字段 | 只更新部分字段 |
| {{set:auto\|exclude=字段}} | 排除某些字段 | 排除不可变字段(如ID、创建时间) |
场景2:按条件查询
// 查询已激活的用户,按年龄排序
[Sqlx("SELECT {{columns:auto}} FROM {{table}} WHERE {{where:is_active}} {{orderby:age_desc}}")]
Task<List<User>> GetActiveUsersAsync(bool isActive = true);
场景3:模糊搜索
// 搜索名字或邮箱包含关键词的用户
[Sqlx("SELECT {{columns:auto}} FROM {{table}} WHERE {{contains:name|text=@keyword}} OR {{contains:email|text=@keyword}}")]
Task<List<User>> SearchAsync(string keyword);
场景4:分页查询
// 分页获取用户列表
[Sqlx("SELECT {{columns:auto}} FROM {{table}} {{orderby:id}} {{limit:sqlite|offset=@offset|rows=@pageSize}}")]
Task<List<User>> GetPagedAsync(int offset, int pageSize);
场景5:统计数据
// 统计用户数量
[Sqlx("SELECT {{count:all}} FROM {{table}} WHERE {{where:is_active}}")]
Task<int> CountActiveUsersAsync(bool isActive = true);
// 计算平均年龄
[Sqlx("SELECT {{avg:age}} FROM {{table}}")]
Task<double> GetAverageAgeAsync();
🎯 为什么选择 Sqlx?
对比其他方案
| 特性 | Sqlx | Entity Framework Core | Dapper |
|---|---|---|---|
| 💻 学习成本 | ⭐⭐ 很简单 | ⭐⭐⭐⭐ 复杂 | ⭐⭐⭐ 一般 |
| 📝 写代码量 | 很少 | 很多配置 | 需要写SQL |
| ⚡ 性能 | 极快 | 较慢 | 快 |
| 🚀 启动速度 | 1秒 | 5-10秒 | 2秒 |
| 📦 程序大小 | 15MB | 50MB+ | 20MB |
| 🌐 多数据库 | ✅ 自动适配 | ⚠️ 需配置 | ❌ 手动改SQL |
| 🛡️ 类型安全 | ✅ 编译时检查 | ✅ | ❌ 运行时 |
| 🔄 字段改动 | ✅ 自动更新 | ⚠️ 需迁移 | ❌ 手动改 |
📚 详细教程
🎓 新手入门
- ⚡ 5分钟快速开始 - 最快上手指南
- 📝 增删改查完整教程 - 所有数据库操作
- 💡 最佳实践 - 推荐的使用方式
🔧 进阶功能
- 🎯 23个占位符详解 - 所有功能说明
- 🌐 多数据库支持 - 如何切换数据库
- ⚙️ 高级特性 - 复杂场景处理
💼 实战示例
📋 TodoWebApi - 完整的 Web API 示例
- 14 个方法展示所有功能
- ASP.NET Core 集成
- SQLite 数据库
🎮 SqlxDemo - 功能演示项目
- 23 个占位符示例
- 6 种数据库适配演示
🎁 实际收益
开发效率提升
传统方式开发一个 CRUD 功能:
- 写 4 个方法 × 10 个字段 = 40 次列名输入
- 字段改动需要检查所有 SQL
- 预计耗时:2-3 小时
Sqlx 方式:
- 定义接口 4 个方法,零列名输入
- 字段改动自动更新
- 预计耗时:15 分钟
⏱️ 效率提升:12 倍!
维护成本降低
传统项目添加一个字段:
❌ 检查所有 SQL 语句 (可能 50+ 处)
❌ 修改插入语句
❌ 修改更新语句
❌ 修改查询语句
❌ 测试所有功能
⏱️ 预计耗时:3-4 小时
Sqlx 项目添加一个字段:
✅ 在 Model 类添加属性
✅ 重新编译 (自动更新所有 SQL)
✅ 测试主要功能
⏱️ 预计耗时:10 分钟
💰 维护成本降低:95%!
❓ 常见问题
Q1:Sqlx 适合我的项目吗?
A: 如果你的项目:
- ✅ 需要操作数据库(增删改查)
- ✅ 希望代码简洁易维护
- ✅ 可能更换数据库类型
- ✅ 追求高性能
那么 Sqlx 非常适合你!
Q2:需要学习复杂的概念吗?
A: 不需要!Sqlx 的设计理念就是简单:
- 定义数据类型(就是普通的 C# 类)
- 定义接口方法(用占位符代替列名)
- 添加一个特性(
[RepositoryFor]) - 完成!
Q3:性能怎么样?
A: Sqlx 性能极致:
- 🚀 启动速度:比 EF Core 快 10 倍
- ⚡ 查询速度:接近手写 ADO.NET
- 💾 内存占用:比 EF Core 少 70%
- 📦 程序大小:AOT 编译后仅 15MB
Q4:可以和现有项目集成吗?
A: 完全可以!Sqlx 不会影响现有代码,你可以:
- 在新功能中使用 Sqlx
- 逐步迁移旧代码
- 与 Dapper、EF Core 共存
Q5:支持哪些数据库?
A: 支持 6 大主流数据库:
- ✅ SQL Server
- ✅ MySQL
- ✅ PostgreSQL
- ✅ SQLite
- ✅ Oracle
- ✅ DB2
🔥 快速开始
方式1:运行示例项目
# 克隆仓库
git clone https://github.com/your-org/sqlx.git
cd sqlx
# 运行 TodoWebApi 示例
cd samples/TodoWebApi
dotnet run
# 访问 http://localhost:5000
方式2:创建新项目
# 创建项目
dotnet new webapi -n MyProject
cd MyProject
# 安装 Sqlx
dotnet add package Sqlx
dotnet add package Sqlx.Generator
# 开始编码!
💬 获取帮助
📄 开源协议
本项目采用 MIT 协议 开源,可自由用于商业项目。
<div align="center">
🌟 觉得不错?给个 Star 吧!
Sqlx - 让数据库操作回归简单 ✨
Made with ❤️ by the Sqlx Team
</div>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.6.8 | 96 | 2/7/2026 |
| 0.6.7 | 81 | 2/5/2026 |
| 0.6.6 | 80 | 2/3/2026 |
| 0.6.5 | 97 | 1/23/2026 |
| 0.6.4 | 87 | 1/22/2026 |
| 0.6.3 | 86 | 1/22/2026 |
| 0.6.2 | 99 | 1/16/2026 |
| 0.6.1 | 84 | 1/15/2026 |
| 0.6.0 | 83 | 1/15/2026 |
| 0.5.0 | 107 | 1/11/2026 |
| 0.4.0 | 213 | 10/27/2025 |
| 0.3.0 | 284 | 10/2/2025 |
| 0.2.0 | 227 | 9/21/2025 |
| 0.1.4-dev | 210 | 8/31/2025 |
| 0.1.3-dev | 118 | 8/23/2025 |
| 0.1.2-dev | 177 | 8/20/2025 |
| 0.1.1-dev | 149 | 8/17/2025 |
| 0.1.0-dev | 164 | 7/27/2025 |
v3.0.0 - Minimalist architecture refactoring
Major simplification: Four core module design - Sqlx, ExpressionToSql, RepositoryFor, SqlTemplate
Removed redundant features: Focus on core scenarios, improve development efficiency
Full AOT optimization: Remove complex reflection, improve runtime performance
Four major database support: SQL Server, MySQL, PostgreSQL, SQLite
Breaking update: Not backward compatible, focus on the future
Simplified API design, learning cost reduced by 70%