Flutter数据库查询构建插件database_query_builder的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter数据库查询构建插件database_query_builder的使用


由Jean Roldan开发

pub package License: MIT style: very good analysis

# 介绍

数据库查询构建器为Dart提供了一个简单、高效且流畅的接口来构建或运行数据库查询。它可用于执行大多数基本(临时)数据库操作,并与postgresql完美配合。我们希望以后能支持其他管理器。

此项目将暂时依赖于我们的源postgres库来连接到该管理器并执行查询,尽管确实存在多个基于ORM的库,但我们想要做一些自己的东西,一些疯狂的东西!

您可以使用我们的文件或使用自己的数据库进行测试,无需担心成功与否。

# 数据方法

我们有几个方法可以从查询中获取信息:

  • get() 返回一个类型为map<String, dynamic>的列表,根据您的查询。
  • getModel<T>() 返回一个强类型的类列表,以生成直接模型。
  • toSql() 获取由查询构建器生成的查询,不需要数据库连接,您可以使用此函数生成所需的SQL,帮助您避免SQL注入。
DB.table('products').get();
DB.table('products').getModel<Product>(Product.fromJson);
DB.table('products').toSql();

原始表达式

# 插入语句

基本插入

提供了一个insert方法,可以使用键值对的映射来插入记录。

final numRowAffected = await DB.table('persons').insert({
    'firstName': 'testFirstName',
    'lastName': 'testLastName',
    'age': 30,
}).save()

多条插入

您可以一次性插入多条记录,通过传递一个包含键值对映射的列表来使用insertAll方法。

final sql03 = await DB.table('persons').insertAll([
  {
    'firstName': 'testFirstName1',
    'lastName': 'testLastName1',
    'age': 10,
  },
  {
    'firstName': 'testFirstName2',
    'lastName': 'testLastName2',
    'age': 20,
  },
  {
    'firstName': 'testFirstName3',
    'lastName': 'testLastName3',
    'age': 30,
  }
]).save();

获取插入ID

您可以使用insertGetId获取受影响行的ID,这将执行内部查询以获取主键。

final numRowAffected = await DB.table('persons').insertGetId({
    'firstName': 'testFirstName',
    'lastName': 'testLastName',
    'age': 30,
}).save()

如果您想避免双查询或者您没有读取这些属性的权限并且想提高查询性能,可以指定您的主键。

final numRowAffected = await DB.table('persons').insertGetId({
    'firstName': 'testFirstName',
    'lastName': 'testLastName',
    'age': 30,
},
'id').save()

同样地,您可以插入多条记录并获取它们的ID。

final numRowAffected = DB.table('people').insertAllGetIds(
  [
    {
      'first_name': 'new first name 1',
      'last_name': 'new first last name 1',
      'age': 12,
    },
    {
      'first_name': 'new first name 2',
      'last_name': 'new first last name 2',
      'age': 17,
    },
    {
      'first_name': 'new first last name 3',
      'last_name': 'new first last name 3',
      'age': 118,
    }
  ],
  'id',
);

# 选择语句

选择

DB.table('persons').select(['firstName','age']).get();

唯一性

# 条件语句

条件子句

创建简单的查询。

DB.table('people').where('age', '10').get();

您也可以使用自定义条件。

await DB.table('people').where('age', '=', 10).get();

否则,我们为您提供强类型的条件。

await DB.table('people').where('age', WhereType.equal, '10').get();
await DB.table('people').where('age', WhereType.greaterThan, '10').get();
await DB.table('people').where('age', WhereType.greaterThanOrEqual, '10').get();
await DB.table('people').where('age', WhereType.lessThan, '10').get();
await DB.table('people').where('age', WhereType.lessThanOrEqual, '10').get();
await DB.table('people').where('age', WhereType.like, '10').get();

嵌套条件

如果您已经看到如何分配where语句的工作方式,您可以随意以嵌套的方式进行。

DB.table('people')
  .where('age', 25)
  .where('age', '=', 10)
  .where('age', WhereType.greaterThan, 80)
  .get();

IN 条件

DB.table('people').whereIN('age', [10, 20, 30])

OR 条件

# 更新语句

更新

DB.table('persons')
  .update({'firstName': 'new first name', 'lastName': 'new last name'})
  .save();

带有条件更新

DB.table('persons')
  .update({'firstName': 'new first name', 'lastName': 'new last name'})
  .where('id', '1')
  .save();

更新或插入

# 删除语句

删除

您可以删除表中的所有记录。

DB.table('people').delete().save()

带有条件删除

执行搜索以删除记录。

DB.table('people').delete().where('id', 5).save();

更多关于Flutter数据库查询构建插件database_query_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库查询构建插件database_query_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用database_query_builder插件来构建数据库查询的示例。这个插件允许你以声明式的方式构建SQL查询,使得查询的创建更加直观和安全。

首先,确保你已经在pubspec.yaml文件中添加了database_query_builder依赖:

dependencies:
  flutter:
    sdk: flutter
  database_query_builder: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个完整的示例,展示如何使用database_query_builder来构建一个查询并执行它。假设我们有一个SQLite数据库,并且我们想要查询一个名为users的表。

1. 导入必要的包

import 'package:flutter/material.dart';
import 'package:database_query_builder/database_query_builder.dart';
import 'package:sqflite/sqflite.dart';

2. 打开数据库连接

Future<Database> initDb() async {
  return await openDatabase(
    join(await getDatabasesPath(), 'my_database.db'),
    onCreate: (db, version) async {
      await db.execute(
        'CREATE TABLE users ('
        'id INTEGER PRIMARY KEY,'
        'name TEXT NOT NULL,'
        'age INTEGER NOT NULL'
        ')',
      );
    },
    version: 1,
  );
}

3. 构建查询并执行

Future<List<Map<String, dynamic>>> queryUsers(Database db, int minAge) async {
  // 使用database_query_builder构建查询
  var select = Select()
    .from('users')
    .where(Condition('age').greaterThanOrEqual(minAge));

  // 转换为SQL语句
  var sql = select.toSql();
  print('Generated SQL: $sql');

  // 执行查询
  List<Map<String, dynamic>> results = await db.rawQuery(sql);
  return results;
}

4. 在Flutter UI中使用

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Map<String, dynamic>> users = [];

  @override
  void initState() {
    super.initState();
    _initializeApp();
  }

  Future<void> _initializeApp() async {
    Database db = await initDb();
    users = await queryUsers(db, 18);

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('User List'),
        ),
        body: ListView.builder(
          itemCount: users.length,
          itemBuilder: (context, index) {
            var user = users[index];
            return ListTile(
              title: Text('Name: ${user['name']}, Age: ${user['age']}'),
            );
          },
        ),
      ),
    );
  }
}

注意事项

  1. 依赖项:确保你同时安装了sqflite包,因为database_query_builder本身并不直接处理数据库连接,而是生成SQL语句供像sqflite这样的数据库库执行。

  2. 错误处理:在实际应用中,添加适当的错误处理是非常重要的,比如处理数据库打开失败、查询执行失败等情况。

  3. 性能:对于大型数据集,生成的SQL语句可能需要优化,以确保查询性能。

这个示例展示了如何使用database_query_builder来构建并执行一个基本的SQL查询。根据你的需求,你可以进一步扩展这个示例,比如添加更多的查询条件、排序规则等。

回到顶部