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 类是所有查询的基础,可以进行扩展以支持额外的数据库驱动程序和自定义查询类型。
在接下来的部分,您将找到支持的每种查询类型的详细文档:SelectQuery、InsertQuery、UpdateQuery 和 DeleteQuery。这些指南将帮助您了解如何有效且高效地使用 dart_sql_builder 包为您的 Dart 应用程序构建 SQL 查询。
现在,深入了解每种查询类型的文档,以了解如何充分利用 dart_sql_builder 包
- SelectQuery ?
- InsertQuery ?
- UpdateQuery ?
- 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.asc 或 Order.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 是用心开发的 ❤️,我们期待着在您的支持下看到它的成长和发展。
祝您编码愉快!?