Dart SQL 构建器?

dart_sql_builder 是一个强大而灵活的 Dart 查询构建器,它简化了创建复杂 SQL 查询的过程。它不是 ORM,也不是类型安全的,但它提供了一种更具可读性和可维护性的方式来构建 SQL 查询,而无需编写原始的 SQL 字符串。

该包支持各种查询类型,包括 SELECT、INSERT、UPDATE 和 DELETE 查询。它还提供了一个方便的 API,用于将查询组件链接在一起,从而轻松地以最少的精力创建复杂的查询 ?️。

除了核心的查询构建功能外,dart_sql_builder 还计划进行未来的增强,例如:

  • 用于管理数据库表的迁移工具 ?
  • 除了 PostgreSQL 之外,还支持其他 SQL 驱动程序 ?
  • 用于帮助创建类型安全查询的构建器 ?

dart_sql_builder 包带有一个内置的 PostgreSQL 驱动程序,可以轻松集成到您的 Dart 项目中。以下是有关如何使用该包与 PostgreSQL 驱动程序结合使用的示例:

final postgreSQL = PostgreSQL();
final selectQuery = postgreSQL.select;
final insertQuery = postgreSQL.insert;
final updateQuery = postgreSQL.update;
final deleteQuery = postgreSQL.delete;

您可以使用 PostgreSQL 运行查询

final postgreSQL = PostgreSQL();

await postgreSQL.open();

final query = postgreSQL.select
  ..select(['name', 'age'])
  ..from('users')
  ..where('age > ?', [30]);

await query.query();
await query.queryMapped();
await query.execute();

或运行原始查询

final postgreSQL = PostgreSQL();
final query = 'SELECT COUNT(*) FROM users';

await postgreSQL.rawQuery(query);
await query.rawQueryMapped(query);
await query.rawExecute(query);

基础 Query 类是所有查询的基础,可以进行扩展以支持额外的数据库驱动程序和自定义查询类型。

在接下来的部分,您将找到支持的每种查询类型的详细文档:SelectQueryInsertQueryUpdateQueryDeleteQuery。这些指南将帮助您了解如何有效且高效地使用 dart_sql_builder 包为您的 Dart 应用程序构建 SQL 查询。

现在,深入了解每种查询类型的文档,以了解如何充分利用 dart_sql_builder

  1. SelectQuery ?
  2. InsertQuery ?
  3. UpdateQuery ?
  4. DeleteQuery

InsertQuery

将新行添加到数据库中的表中。InsertQuery 允许您一次插入单行或多行,甚至提供冲突处理选项来处理唯一约束。

用法

要使用 InsertQuery,首先需要创建一个实例。然后,您可以链接方法来根据需要构建查询。

以下是构建简单 INSERT 查询的示例:

final query = InsertQuery()
  ..into('users')
  ..insert({'name': 'John Doe', 'age': 30});

这将生成以下 SQL 查询:

INSERT INTO users (name, age) VALUES ('John Doe', 30);

方法

into

into 方法用于指定要插入的表。

query.into('users');

insert

insert 方法用于指定要在表中为列插入的值。您可以传递一个包含列名及其对应值的映射。

query.insert({'name': 'John Doe', 'age': 30});

insertAll

insertAll 方法用于一次插入多行。您可以传递一个映射列表,其中每个映射包含列名及其对应的值。

query.insertAll([
  {'name': 'John Doe', 'age': 30},
  {'name': 'Jane Doe', 'age': 25}
]);

onConflictDoNothing

onConflictDoNothing 方法用于指定在与指定列发生冲突时,插入操作不执行任何操作。

query.insert({'name': 'John Doe', 'age': 30, 'unq': 'test'}).onConflictDoNothing(['unq']);

onConflictDoUpdate

onConflictDoUpdate 方法用于指定在与提供的列发生冲突时,插入操作应更新指定的列。

query.insert({'name': 'John Doe', 'age': 30, 'unq': 'test'}).onConflictDoUpdate(['unq'], {'age': 31});

returning

returning 方法用于指定插入操作后要返回的列。您可以传递一个字符串数组,其中每个字符串代表一个列名。

query.returning(['id']);

returnAll

returnAll 方法用于在插入操作后返回所有列。

query.returnAll();

示例

以下是使用 InsertQuery 的复杂 INSERT 查询示例:

final query = InsertQuery()
  ..into('users')
  ..insert({'name': 'John Doe', 'age': 30, 'unq': 'test'})
  ..onConflictDoUpdate(['unq'], {'age': 31})
  ..returnAll();

这将生成以下 SQL 查询:

INSERT INTO users (name, age, unq) VALUES ('John Doe', 30, 'test')
ON CONFLICT (unq) DO UPDATE SET age = 31 RETURNING *;

SelectQuery

从数据库中的一个或多个表中检索数据。使用 SelectQuery,您可以过滤、排序、分组和连接数据,从而轻松获取所需内容。

用法

要使用 SelectQuery,首先需要创建一个实例。然后,您可以链接方法来根据需要构建查询。

以下是构建简单 SELECT 查询的示例:

final query = SelectQuery()
  ..select(['name', 'age'])
  ..from('users')
  ..where('age > ?', [30]);

这将生成以下 SQL 查询:

SELECT name, age FROM users WHERE age > 30;

方法

select

select 方法用于指定查询中要选择的列。您可以传递一个字符串数组,其中每个字符串代表一个列名。

query.select(['name', 'age']);

selectAll

selectAll 方法用于选择查询中的所有列。

query.selectAll();

selectDistinct

selectDistinct 方法用于选择指定列的唯一值。

query.selectDistinct(['age']);

from

from 方法用于指定要从中选择的表。

query.from('users');

where

where 方法用于向查询添加 WHERE 条件。您可以传递一个表示条件的字符串,以及一个用于替换条件中占位符的值数组。

query.where('age > ?', [30]);

and

and 方法用于向查询添加 AND 运算符,允许您链接多个 WHERE 条件。

query.where('age > ?', [30]).and().where('country = ?', ['USA']);

或者

or 方法用于向查询添加 OR 运算符,允许您链接多个 WHERE 条件。

query.where('age > ?', [30]).or().where('country = ?', ['USA']);

join

join 方法用于将另一个表连接到查询。您可以传递表名、ON 条件以及连接类型(默认为 INNER JOIN)。

query.join('orders', 'users.id = orders.user_id');

groupBy

groupBy 方法用于按一个或多个列对结果进行分组。

query.groupBy(['country']);

having

having 方法用于向查询添加 HAVING 条件,与 GROUP BY 一起用于过滤结果。

query.having('COUNT(*) > ?', [1]);

orderBy

orderBy 方法用于按一个或多个列对结果进行排序。您可以传递一个列名数组和一个 Order 枚举值数组(Order.ascOrder.desc)来指定每列的顺序。

query.orderBy(['age'], [Order.desc]);

limit

limit 方法用于限制查询返回的结果数量。

query.limit(10);

offset

offset 方法用于指定查询返回结果的起始点。

query.offset(20);

示例

以下是使用 SelectQuery 的复杂 SELECT 查询示例:

final query = SelectQuery()
  ..select(['users.name', 'orders.product'])
  ..from('users')
  ..join('orders', 'users.id = orders.user_id', JoinType.left)
  ..where('users.age > ?', [21])
  ..and()
  ..where('users.country = ?', ['USA'])
  ..groupBy(['users.name', 'orders.product'])
  ..orderBy(['users.name'], [Order.desc])
  ..limit(10);

这将生成以下 SQL 查询:

SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.age > 21 AND users.country = 'USA'
GROUP BY users.name, orders.product
ORDER BY users.name DESC
LIMIT 10;

UpdateQuery

修改数据库中的现有数据。UpdateQuery 使您能够根据一组条件更新表中的特定列,从而轻松地将更改应用于目标行。

用法

要使用 UpdateQuery,首先需要创建一个实例。然后,您可以链接方法来根据需要构建查询。

以下是构建简单 UPDATE 查询的示例:

final query = UpdateQuery()
  ..update('users')
  ..set({'name': 'John Doe', 'age': 31})
  ..where('id = ?', [1]);

这将生成以下 SQL 查询:

UPDATE users SET name = 'John Doe', age = 31 WHERE id = 1;

方法

update

update 方法用于指定要更新的表。

query.update('users');

set

set 方法用于指定要为表中的列设置的值。您可以传递一个包含列名及其对应值的映射。

query.set({'name': 'John Doe', 'age': 31});

where

where 方法用于向查询添加 WHERE 条件。您可以传递一个表示条件的字符串,以及一个用于替换条件中占位符的值数组。

query.where('id = ?', [1]);

and

and 方法用于向查询添加 AND 运算符,允许您链接多个 WHERE 条件。

query
    ..where('age > ?', [30])
    ..and()
    ..where('country = ?', ['USA']);

或者

or 方法用于向查询添加 OR 运算符,允许您链接多个 WHERE 条件。

query
    ..where('age > ?', [30])
    ..or()
    ..where('country = ?', ['USA']);

returning

returning 方法用于指定更新操作后要返回的列。您可以传递一个字符串数组,其中每个字符串代表一个列名。

query.returning(['id']);

returnAll

returnAll 方法用于在更新操作后返回所有列。

query.returnAll();

示例

以下是使用 UpdateQuery 的复杂 UPDATE 查询示例:

final query = UpdateQuery()
  ..update('users')
  ..set({'name': 'John Doe', 'age': 31})
  ..where('age > ?', [21])
  ..and()
  ..where('country = ?', ['USA'])
  ..returnAll();

这将生成以下 SQL 查询:

UPDATE users SET name = 'John Doe', age = 31 WHERE age > 21 AND country = 'USA' RETURNING *;

DeleteQuery

从数据库中删除数据。DeleteQuery 允许您根据特定条件从表中删除行,确保您只删除预期的那些数据。

用法

要使用 DeleteQuery,首先需要创建一个实例。然后,您可以链接方法来根据需要构建查询。

以下是构建简单 DELETE 查询的示例:

final query = DeleteQuery()
  ..deleteFrom('users')
  ..where('id = ?', [1]);

这将生成以下 SQL 查询:

DELETE FROM users WHERE id = 1;

方法

deleteFrom

deleteFrom 方法用于指定要从中删除的表。

query.deleteFrom('users');

where

where 方法用于向查询添加 WHERE 条件。您可以传递一个表示条件的字符串,以及一个用于替换条件中占位符的值数组。

query.where('id = ?', [1]);

and

and 方法用于向查询添加 AND 运算符,允许您链接多个 WHERE 条件。

query.where('age > ?', [30]).and().where('country = ?', ['USA']);

或者

or 方法用于向查询添加 OR 运算符,允许您链接多个 WHERE 条件。

query.where('age > ?', [30]).or().where('country = ?', ['USA']);

returning

returning 方法用于指定删除操作后要返回的列。您可以传递一个字符串数组,其中每个字符串代表一个列名。

query.returning(['id']);

returnAll

returnAll 方法用于在删除操作后返回所有列。

query.returnAll();

示例

以下是使用 DeleteQuery 的复杂 DELETE 查询示例:

final query = DeleteQuery()
  ..deleteFrom('users')
  ..where('age > ?', [21])
  ..and()
  ..where('country = ?', ['USA'])
  ..returnAll();

这将生成以下 SQL 查询:

DELETE FROM users WHERE age > 21 AND country = 'USA' RETURNING *;

总结 ?

社区的贡献,以帮助改进和扩展该包的功能和能力,总是受欢迎的 ?。

dart_sql_builder 是根据 MIT 许可发布的,这意味着您可以自由地使用、修改和分发代码。

请记住,dart_sql_builder 是用心开发的 ❤️,我们期待着在您的支持下看到它的成长和发展。

祝您编码愉快!?

GitHub

查看 Github