Sqlx 0.3.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Sqlx --version 0.3.0
                    
NuGet\Install-Package Sqlx -Version 0.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Sqlx" Version="0.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Sqlx" Version="0.3.0" />
                    
Directory.Packages.props
<PackageReference Include="Sqlx" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Sqlx --version 0.3.0
                    
#r "nuget: Sqlx, 0.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Sqlx@0.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Sqlx&version=0.3.0
                    
Install as a Cake Addin
#tool nuget:?package=Sqlx&version=0.3.0
                    
Install as a Cake Tool

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 INTO UPDATE DELETE 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
🛡️ 类型安全 ✅ 编译时检查 ❌ 运行时
🔄 字段改动 ✅ 自动更新 ⚠️ 需迁移 ❌ 手动改

📚 详细教程

🎓 新手入门

🔧 进阶功能

💼 实战示例

  • 📋 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 的设计理念就是简单:

  1. 定义数据类型(就是普通的 C# 类)
  2. 定义接口方法(用占位符代替列名)
  3. 添加一个特性([RepositoryFor]
  4. 完成!

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 - 让数据库操作回归简单

⭐ Star · 📖 文档 · 🎮 示例


Made with ❤️ by the Sqlx Team

</div>

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .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%