Flutter数据库连接插件edgedb的使用

Flutter数据库连接插件edgedb的使用

这是EdgeDB的官方Dart客户端库。如果您刚刚开始使用EdgeDB,我们建议先阅读EdgeDB快速入门,该指南将引导您完成安装EdgeDB、创建简单模式以及编写一些简单查询的过程。

注意: 只有EdgeDB版本 >= 2.0才受此库支持。

安装

在您的pubspec.yaml文件中添加edgedb依赖项:

dart pub add edgedb

此包包含核心的edgedb库,它导出了所有连接到EdgeDB服务器并运行查询所需的API。此外,还包含edgeql-codegen库,该库提供了Dart的build_runner构建器,可以从.edgeql文件生成完全类型化的查询方法。

基本用法

首先,您需要安装EdgeDB,并为您的项目创建一个实例;我们推荐快速入门指南以了解如何操作。

然后导入edgedb库,并使用createClient()创建一个新的客户端。

import 'package:edgedb/edgedb.dart';

final client = createClient();

在大多数情况下,createClient()不需要任何参数;如果使用的是EdgeDB项目(开发推荐)或通过环境变量提供连接选项(生产推荐),库会自动确定如何连接到您的实例。有关更多高级用例,请参阅createClient()的API文档。

现在您可以开始执行查询了:

void main() async {
  final movie = await client.querySingle(r'''
    select Movie {
      title,
      release_year,
      actors: {
        name,
        @character_name
      }
    } filter .title = <str>$title
  ''', {
    'title': 'Spider-man'
  });

  print(movie);
}

Client类提供了多种方法来运行查询,可以选择返回JSON结果并强制执行结果基数。所有查询方法都有能力在安全的情况下从临时错误(如网络中断)中恢复。Client还有API方便处理事务、设置查询的globals以及其他客户端行为。有关详细信息,请参阅API文档

类型安全

Client上的基本查询方法返回的结果类型为dynamic,并且只对传递给它们的查询参数的类型进行运行时检查。对于完全类型安全的查询,此包提供了一个build_runner构建器在edgeql_codegen库中。此构建器会读取项目中的任何.edgeql文件,并在Client类上生成扩展方法,这些方法返回完全类型化的结果,并接受正确类型的查询参数。

要使用edgeql_codegen,首先在pubspec.yaml文件中添加build_runner依赖项:

dart pub add build_runner

默认情况下,edgeql_codegen构建器会在所有.edgeql文件旁边生成.edgeql.dart文件,因此您可以直接运行buildwatch命令而无需配置:

dart run build_runner build
# 或者
dart run build_runner watch

有关如何生成的类型是如何从.edgeql查询转换的详细信息,请参阅edgeql_codegen库的API文档。

要自定义构建过程,在项目根目录下创建一个build.yaml文件,并遵循build_config文档。如果自定义了sources配置,请确保排除dbschema/migrations目录下的.edgeql文件。

示例代码

以下是一个使用edgeql_codegen的示例:

import 'package:edgedb/edgedb.dart';

import 'getMoviesStarring.edgeql.dart';

void main() async {
  // 创建一个新的客户端
  final client = createClient();

  // 执行查询获取由某个演员主演的电影
  final movies = await client.getMoviesStarring(name: 'Ben Kingsley');

  // 遍历结果并打印
  for (var movie in movies) {
    print('Title: ${movie.title}\n'
          'Release Year: ${movie.release_year}\n'
          'Cast:\n${movie.actors.map((actor) {
      return '  ${actor.$character_name}: ${actor.name}';
    }).join('\n')}\n');
  }

  // 关闭客户端连接
  await client.close();
}

更多关于Flutter数据库连接插件edgedb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter中连接并使用EdgeDB数据库可以通过一个自定义的插件或者第三方库来实现。然而,由于EdgeDB是一个相对较新的数据库系统,可能还没有现成的Flutter插件直接支持。不过,你可以通过调用原生代码(如Dart的ffi包或者通过平台通道与原生Android/iOS代码交互)来实现与EdgeDB的连接。

以下是一个简化的示例,展示了如何通过平台通道在Flutter中调用原生代码来与EdgeDB进行交互。注意,这只是一个概念验证,并非完整的解决方案,因为实际实现会涉及到更多的细节和错误处理。

原生Android代码

首先,你需要在Android项目中添加EdgeDB的Java客户端库。由于EdgeDB的Java客户端可能不是现成的,这里假设你已经有了相应的库或者通过其他方式(如JNI调用C++客户端)实现了与EdgeDB的交互。

// MainActivity.java
package com.example.edgedbflutter;

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "com.example.edgedbflutter/channel";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler(
                        (call, result) -> {
                            if (call.method.equals("queryEdgeDB")) {
                                String query = call.argument("query");
                                // 假设你有一个EdgeDBClient类来处理数据库连接和查询
                                EdgeDBClient client = new EdgeDBClient("your_database_dsn");
                                String resultFromDB = client.executeQuery(query);

                                // 将结果返回给Flutter
                                result.success(resultFromDB);
                            } else {
                                result.notImplemented();
                            }
                        }
                );
    }
}

// EdgeDBClient.java (假设的实现)
package com.example.edgedbflutter;

public class EdgeDBClient {
    private String dsn;

    public EdgeDBClient(String dsn) {
        this.dsn = dsn;
        // 初始化数据库连接(这里省略具体实现)
    }

    public String executeQuery(String query) {
        // 执行查询并返回结果(这里省略具体实现)
        // 假设返回查询结果的字符串表示
        return "Query result from EdgeDB";
    }
}

原生iOS代码

对于iOS,你需要使用Swift或Objective-C来实现与EdgeDB的交互,并通过Flutter的平台通道返回结果。同样地,这里假设你已经有了EdgeDB的iOS客户端或者通过其他方式实现了与EdgeDB的交互。

// AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "com.example.edgedbflutter/channel", binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler {
            (call: FlutterMethodCall, result: @escaping FlutterResult) in
            if call.method == "queryEdgeDB" {
                let query = call.arguments as! String
                let resultFromDB = queryEdgeDB(query: query)
                result(resultFromDB)
            } else {
                result(FlutterMethodNotImplemented)
            }
        }
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

func queryEdgeDB(query: String) -> String {
    // 假设你有一个EdgeDB的iOS客户端来处理数据库连接和查询
    // 这里省略具体实现,直接返回模拟结果
    return "Query result from EdgeDB"
}

Flutter代码

在Flutter端,你可以通过MethodChannel与原生代码进行交互。

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

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

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example.edgedbflutter/channel');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('EdgeDB Flutter Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _queryDatabase,
            child: Text('Query EdgeDB'),
          ),
        ),
      ),
    );
  }

  Future<void> _queryDatabase() async {
    try {
      final String result = await platform.invokeMethod('queryEdgeDB', <String, dynamic>{'query': 'SELECT 1;'});
      print(result); // 打印从数据库获取的结果
    } on PlatformException catch (e) {
      print("Failed to invoke: '${e.message}'.");
    }
  }
}

这个示例展示了如何通过平台通道在Flutter应用中调用原生代码来与EdgeDB进行交互。实际实现中,你需要根据EdgeDB的客户端库来完善原生代码部分,并确保数据库连接和查询的正确性。

回到顶部