Sqler — 查询构建器
Sqler 是适用于 MySQL 和 SQLite 的流式查询构建器,两个后端使用相同的 API。
为什么使用 Sqler?
- 防止 SQL 注入(绑定参数)
- 可组合、可复用的查询
- IDE 友好,支持自动补全
- MySQL 和 SQLite 统一 API
核心类
| 类 | 描述 |
|---|---|
Sqler |
主查询构建器 |
QField |
列引用(用于 JOIN) |
QVar |
字面量值(用于列与列的比较) |
QSelect |
嵌套 SELECT 的子查询 |
SELECT
var sqler = Sqler(table: usersTable);
var users = await sqler
.select(['id', 'name', 'email'])
.where('is_active', '=', true)
.orderBy('name')
.limit(10)
.offset(20)
.get();
多个 WHERE 条件
var results = await sqler
.where('age', '>', 18)
.where('role', '=', 'admin')
.orWhere('is_superuser', '=', true)
.get();
JOIN
var results = await sqler
.join(
table: rolesTable,
on: QField('users.role_id', '=', QField('roles.id')),
)
.select(['users.name', 'roles.title'])
.get();
INSERT
// 插入一行——返回插入的 ID
var id = await sqler.insert({
'name': 'Ali',
'email': '[email protected]',
'is_active': true,
});
// 批量插入
await sqler.insertMany([
{'name': 'Ali', 'email': '[email protected]'},
{'name': 'Sara', 'email': '[email protected]'},
]);
UPDATE
var affected = await sqler
.where('id', '=', userId)
.update({'name': 'Ali Ahmadi', 'updated_at': DateTime.now()});
DELETE
var deleted = await sqler
.where('id', '=', userId)
.delete();
GROUP BY 和 HAVING
var stats = await sqler
.select(['department', 'COUNT(*) as total', 'AVG(salary) as avg_salary'])
.groupBy('department')
.having('total', '>', 5)
.orderBy('avg_salary', desc: true)
.get();
辅助方法
// 计数
int count = await sqler.where('is_active', '=', true).count();
// 检查是否存在
bool exists = await sqler.where('email', '=', email).exists();
// 获取单行
Map<String, dynamic>? row = await sqler.where('id', '=', id).first();
// 获取单列值列表
var emails = await sqler.pluck('email');