Flutter数据库交互插件surrealdb_js的使用

Flutter数据库交互插件surrealdb_js的使用

surrealdb_js

<surrealdb_js> 插件是一个强大的集成,为 Flutter 提供了对 SurrealDB 的支持。它基于 <surrealdb.js>,这是官方的 SurrealDB JavaScript SDK。

pub package

browser tests

style: very good analysis

Powered by Mason

License: MIT

安装

在开始使用 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 testexample 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

1 回复

更多关于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 包。你可以通过 npmyarn 来安装它。

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
回到顶部