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');