Flutter嵌入式数据库插件duckdb_dart的使用

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

Flutter嵌入式数据库插件duckdb_dart的使用

标题

Flutter嵌入式数据库插件duckdb_dart的使用

内容

DuckDb是一个支持嵌入式的数据库,通过一个Dart客户端API来访问。以下是关于如何使用这个插件的一些信息和示例代码。

特性

  • 发送和执行SQL语句是可行的。
  • 获取数据回传到Dart中对于大多数重要数据类型是可行的。
  • 所有的数据库操作都是同步的。

注意事项

由于作者不是数据库、C语言或Dart方面的专家,因此该包在性能和易用性方面有很大的改进空间。欢迎提交PR。作者可能无法长期维护这个包,并且不太可能提供社区所需的水平的支持。如果这个包的发展速度不够快,建议成为贡献者以便更快地推进项目。作者创建这个包是因为值得探索DuckDB,并且在Dart后端没有很多数据库解决方案。

开始使用

我只有一台Ubuntu 22.04和一台Windows 10机器用于测试。此包已测试了DuckDb版本1.1.0。

要使用此包,您需要安装DuckDb的命令行界面和C/C++绑定,请参阅安装文档。这是一个无痛的过程。对于Linux系统,只需将libduckdb.so复制到/usr/local/lib文件夹中。对于Windows,请确保dll在路径上。

使用示例

final con = Connection.inMemory();
con.execute('CREATE TABLE tbl (state VARCHAR, population INTEGER);');
con.execute("INSERT INTO tbl VALUES ('CA', 39539223), ('VA', 8631393);");
print(con.fetch('SELECT * FROM tbl;'));
con.close();  // 关闭连接以释放资源

从磁盘加载现有数据库

final con = Connection('data.duckdb');
final res = con.fetch('SHOW TABLES;');
con.close();

直接读取CSV文件

final con = Connection.inMemory();
con.execute("CREATE TABLE ontime AS SELECT * FROM 'flights.csv'");
print(con.fetch('SELECT * FROM ontime LIMIT 5;'));

将查询结果映射到Dart类

为了方便起见,您可以使用fetchRows直接将查询结果中的每一行映射到一个Dart类。例如,给定表和类:

class Person {
  Person({required this.name, required this.age});
  String name;
  int age;
}

final class Person {
  Person({required this.name, required this.age});
  String name;
  int age;
}

你可以使用fetchRows将表中的行映射到Person类:

final result = con.fetchRows('SELECT name, age FROM people ORDER BY name;',
    (List row) => Person(name: row[0], age: row[1]));
assert(result.length == 3);
assert(result.first.name == 'Jenny');
assert(result.first.age == 29);

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

1 回复

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


当然,以下是如何在Flutter项目中使用duckdb_dart插件来操作嵌入式数据库DuckDB的一个简单示例。duckdb_dart是一个允许Flutter应用与DuckDB数据库交互的Dart包。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加duckdb_dart依赖:

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

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

2. 导入包

在你的Dart文件中导入duckdb_dart包:

import 'package:duckdb_dart/duckdb_dart.dart';

3. 使用DuckDB

以下是一个简单的示例,展示如何连接到DuckDB数据库,创建一个表,插入数据,并执行查询:

void main() async {
  // 创建一个DuckDB数据库实例
  var db = DuckDB();

  // 打开一个连接(这里使用内存数据库,也可以使用文件数据库)
  await db.open(':memory:'); // 使用内存数据库,或者指定文件路径,如 'example.db'

  // 创建一个表
  await db.execute('''
    CREATE TABLE example (
      id INTEGER PRIMARY KEY,
      name TEXT
    );
  ''');

  // 插入数据
  await db.execute('INSERT INTO example (id, name) VALUES (1, "Alice")');
  await db.execute('INSERT INTO example (id, name) VALUES (2, "Bob")');

  // 查询数据
  var result = await db.query('SELECT * FROM example');

  // 打印查询结果
  for (var row in result) {
    print('ID: ${row[0]}, Name: ${row[1]}');
  }

  // 关闭数据库连接
  await db.close();
}

4. 在Flutter Widget中使用

如果你希望在Flutter Widget中使用这个数据库操作,可以将上述代码封装在一个Future函数中,并在Widget的initState或按钮点击事件中调用它。例如:

import 'package:flutter/material.dart';
import 'package:duckdb_dart/duckdb_dart.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('DuckDB Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _result = 'Loading...';

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

  Future<void> _queryDatabase() async {
    var db = DuckDB();
    await db.open(':memory:');

    await db.execute('''
      CREATE TABLE IF NOT EXISTS example (
        id INTEGER PRIMARY KEY,
        name TEXT
      );
    ''');

    await db.execute('INSERT OR REPLACE INTO example (id, name) VALUES (1, "Alice")');
    await db.execute('INSERT OR REPLACE INTO example (id, name) VALUES (2, "Bob")');

    var result = await db.query('SELECT * FROM example');
    setState(() {
      _result = result.map((row) => 'ID: ${row[0]}, Name: ${row[1]}').join('\n');
    });

    await db.close();
  }

  @override
  Widget build(BuildContext context) {
    return Text(_result);
  }
}

在这个例子中,当应用启动时,_queryDatabase函数会被调用,查询结果会显示在屏幕上。

注意

  • 请确保在实际应用中处理异常和错误情况。
  • 对于生产环境,考虑使用更持久化的数据库存储方案,而不是内存数据库。
  • duckdb_dart插件的API可能会随着版本更新而变化,请参考最新的官方文档。

希望这个示例能帮助你开始使用duckdb_dart插件!

回到顶部