Flutter数据库交互插件surrealdb_js的使用
Flutter数据库交互插件surrealdb_js的使用
surrealdb_js
<surrealdb_js> 插件是一个强大的集成,为 Flutter 提供了对 SurrealDB 的支持。它基于 <surrealdb.js>,这是官方的 SurrealDB JavaScript SDK。
安装
在开始使用 surrealdb_js 之前,必须确保已经在机器上安装了 Flutter SDK。
通过 flutter pub add
安装
flutter pub add surrealdb_js
或者,手动添加到 pubspec.yaml
dependencies:
surrealdb_js:
然后运行以下命令来安装依赖:
flutter pub get
最后,在 <web/index.html>
文件中添加以下代码:
<script type="module">
import { Surreal, StringRecordId } from "/assets/packages/surrealdb_js/assets/js/index.js";
// 将类型暴露给全局作用域
globalThis.SurrealJS = Surreal;
globalThis.StringRecordId = StringRecordId;
</script>
功能
[x] connect()
[x] close()
[x] use()
[x] create()
[x] update()
[x] merge()
[x] delete()
[x] select()
[x] query()
[x] query_raw()
[x] transaction()
[x] let()
[x] unset()
[x] signup()
[x] signin()
[x] invalidate()
[x] authenticate()
[x] info()
[x] patch()
[x] version()
示例
基本用法
final db = Surreal();
await db.connect('http://127.0.0.1:8000/rpc');
await db.use(namespace: 'surreal', database: 'surreal');
await db.signin({'username': 'root', 'password': 'root'});
final created = db.create('person',
{
'title': 'CTO',
'name': {
'first': 'Tom',
'last': 'Jerry',
},
'marketing': true,
},
);
// created['id'] = person:b9eht8bie8abf0vbcfxh
final id = created['id'].toString();
final merged = await db.merge(
id,
{
'marketing': false,
},
);
final tom = await db.select(id);
final deleted = await db.delete(id);
事务支持
final result = await db.transaction(
showSql: true,
(txn) async {
txn.query('DEFINE TABLE test SCHEMAFULL;');
txn.query('DEFINE FIELD name ON test TYPE string;');
txn.query(
r'CREATE test SET name = $name;',
bindings: {'name': 'John'},
);
if (somethingWrong) {
txn.cancel();
}
},
);
更多代码示例可以参见 integration test 和 example project。
贡献
欢迎贡献!请检查未实现的功能列表、仓库中的问题,并随时提交拉取请求。更多信息请查看 贡献指南。
许可证
该项目采用 MIT 许可证。
引用
如果使用此包,请考虑引用:
@misc{surrealdb_js,
author = {Lim Chee Kin},
title = {surrealdb_js: Flutter SurrealDB SDK for JavaScript package},
year = {2024},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/limcheekin/surrealdb_js}},
}
示例代码
import 'package:flutter/material.dart';
import 'package:surrealdb_js/surrealdb_js.dart';
import 'package:flutter_console_widget/flutter_console.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter SurrealDB SDK for JavaScript Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({
super.key,
});
[@override](/user/override)
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final FlutterConsoleController controller = FlutterConsoleController();
final db = Surreal();
static const commandSymbol = '>';
Future<dynamic> execute(Function function, [String? message]) async {
controller.print(
message: '$commandSymbol $message',
endline: false,
);
dynamic result;
try {
result = await function();
controller.print(
message: ' ✅',
endline: true,
);
if (result != null) {
debugPrint('homepage: result $result');
if (result is Iterable) {
if (result.isNotEmpty) {
if (result.first is List) {
// nested list for multiple statements
if (result
.reduce((value, element) => value + element)
.isNotEmpty) {
controller.print(
message: result.toString(),
endline: true,
);
}
} else {
controller.print(
message: result.toString(),
endline: true,
);
}
}
} else {
controller.print(
message: result.toString(),
endline: true,
);
}
}
} catch (error, stackTrace) {
controller.print(
message: ' ❎ $error',
endline: true,
);
controller.print(
message: stackTrace.toString(),
endline: true,
);
}
return result;
}
Future<void> executeSurrealDbCodes() async {
await execute(
() => db.connect('http://127.0.0.1:8000/rpc'),
'db.connect()',
);
await execute(
() => db.use(namespace: 'surreal', database: 'surreal'),
'db.use()',
);
await execute(
() => db.version(),
'db.version',
);
await execute(
() => db.signin({'username': 'root', 'password': 'root'}),
'db.signin()',
);
await execute(
() {
return db.query('INFO FOR NS');
},
'db.query() ns',
);
final created = await execute(
() {
return db.create(
'person',
{
'title': 'CTO',
'name': {
'first': 'Tom',
'last': 'Jerry',
},
'marketing': true,
},
);
},
'db.create()',
);
final id = created['id'].toString();
await execute(
() {
return db.update(
id,
{
'title': 'CTO',
'name': {
'first': 'Tom',
'last': 'John',
},
},
);
},
'db.update()',
);
await execute(
() => db.merge(
id,
{
'marketing': false,
},
),
'db.merge()',
);
await execute(
() => db.patch(
id,
[
{'op': 'replace', 'path': '/status', 'value': 'completed'},
],
),
'db.patch()',
);
// 批量插入
await execute(
() {
final people = [
{
'title': 'CEO',
'name': {
'first': 'John',
'last': 'Dow',
},
'marketing': true,
},
{
'title': 'COO',
'name': {
'first': 'Gavin',
'last': 'Law',
},
'marketing': true,
},
];
final result = db.query(
'INSERT INTO person \$people',
bindings: {
'people': people,
},
);
return result;
},
'db.query() batch inserts',
);
await execute(
() => db.select('person'),
'db.select()',
);
await execute(
() {
final groups = db.query(
'SELECT marketing, count() FROM type::table(\$table) GROUP BY marketing',
bindings: {
'table': 'person',
},
);
return groups;
},
'db.query() grouping',
);
await execute(
() => db.delete('person'),
'db.delete()',
);
}
[@override](/user/override)
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
await executeSurrealDbCodes();
echoLoop();
});
}
void echoLoop() {
controller.scan().then((value) {
execute(
() => db.query(value),
value,
);
controller.focusNode.requestFocus();
echoLoop();
});
}
[@override](/user/override)
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
title: const Text('Flutter SurrealDB SDK for JavaScript Example'),
),
body: FlutterConsole(
controller: controller,
height: size.height,
width: size.width,
),
);
}
}
更多关于Flutter数据库交互插件surrealdb_js的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库交互插件surrealdb_js的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
surreal_db_js
是一个用于与 SurrealDB 数据库进行交互的 JavaScript 库。虽然它主要用于 JavaScript/TypeScript 环境,但你也可以在 Flutter 项目中使用它,尤其是在 Flutter Web 项目中。以下是如何在 Flutter 项目中使用 surrealdb_js
的基本步骤:
1. 安装 surrealdb_js
首先,你需要在你的 Flutter 项目中安装 surrealdb_js
包。你可以通过 npm
或 yarn
来安装它。
npm install surrealdb.js
或者
yarn add surrealdb.js
2. 在 Flutter 项目中引入 surrealdb_js
由于 surrealdb_js
是一个 JavaScript 库,你需要在 Flutter Web 项目中使用 dart:js
来调用它。
首先,确保你的 index.html
文件中引入了 surrealdb_js
:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Flutter Web</title>
</head>
<body>
<script src="main.dart.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/surrealdb.js"></script>
</body>
</html>
3. 在 Dart 中调用 surrealdb_js
接下来,你可以在 Dart 文件中使用 dart:js
来调用 surrealdb_js
的功能。
import 'dart:js' as js;
void connectToSurrealDB() async {
// 创建 SurrealDB 实例
var surreal = js.JsObject(js.context['Surreal'], []);
// 连接到 SurrealDB
await surreal.callMethod('connect', ['http://localhost:8000/rpc']);
// 使用用户名和密码登录
await surreal.callMethod('signin', [{'user': 'root', 'pass': 'root'}]);
// 选择命名空间和数据库
await surreal.callMethod('use', ['test', 'test']);
// 插入数据
var person = await surreal.callMethod('create', ['person', {'name': 'John Doe', 'age': 30}]);
print('Inserted person: $person');
// 查询数据
var people = await surreal.callMethod('select', ['person']);
print('People: $people');
}
void main() {
connectToSurrealDB();
}
4. 运行 Flutter Web 项目
确保你已经将 Flutter 项目配置为 Web 项目,然后运行:
flutter run -d chrome