Flutter嵌入式数据库插件duckdb_dart的使用
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
更多关于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
插件!